
<!doctype html>
<html lang="zh" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
        <link rel="canonical" href="https://github.tim-wcx.ltd/mkdocs/course/%E5%8D%95%E7%89%87%E6%9C%BA/">
      
      
        <link rel="prev" href="../%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">
      
      
        <link rel="next" href="../PDF%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91/">
      
      <link rel="icon" href="../../assets/images/favicon.png">
      <meta name="generator" content="mkdocs-1.4.3, mkdocs-material-9.1.13">
    
    
      
        <title>单片机 - Tim-Wcx</title>
      
    
    
      <link rel="stylesheet" href="../../assets/stylesheets/main.85bb2934.min.css">
      
        
        <link rel="stylesheet" href="../../assets/stylesheets/palette.a6bdf11c.min.css">
      
      

    
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
    <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
    
  </head>
  
  
    
    
      
    
    
    
    
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="cyan">
  
    
    
      <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#_1" class="md-skip">
          跳转至
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
    
      

<header class="md-header" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="页眉">
    <a href="../.." title="Tim-Wcx" class="md-header__button md-logo" aria-label="Tim-Wcx" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.5 9V1.5h-3V9h-3V1.5h-3V9h-3V1.5H4.65V9H3v1.5h18V9h-1.5m0 4.5h-3V21h-3v-7.5h-3V21h-3v-7.5H4.65V21H3v1.5h18V21h-1.5v-7.5Z"/></svg>

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            Tim-Wcx
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              单片机
            
          </span>
        </div>
      </div>
    </div>
    
      
        <form class="md-header__option" data-md-component="palette">
          
            
            
            
            <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="cyan"  aria-label="切换至夜间模式"  type="radio" name="__palette" id="__palette_1">
            
              <label class="md-header__button md-icon" title="切换至夜间模式" for="__palette_2" hidden>
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
              </label>
            
          
            
            
            
            <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="cyan"  aria-label="切换至日间模式"  type="radio" name="__palette" id="__palette_2">
            
              <label class="md-header__button md-icon" title="切换至日间模式" for="__palette_1" hidden>
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
              </label>
            
          
        </form>
      
    
    
    
      <label class="md-header__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
      </label>
      <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="搜索" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="查找">
        
        <button type="reset" class="md-search__icon md-icon" title="清空当前内容" aria-label="清空当前内容" tabindex="-1">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
        </button>
      </nav>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            正在初始化搜索引擎
          </div>
          <ol class="md-search-result__list" role="presentation"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
            
<nav class="md-tabs" aria-label="标签" data-md-component="tabs">
  <div class="md-grid">
    <ul class="md-tabs__list">
      
        
  
  


  
  
  
    <li class="md-tabs__item">
      <a href="../../problem/%E7%BB%84%E9%98%9F%E8%AE%AD%E7%BB%83%E8%B5%9B%EF%BC%88%E5%9B%9B%EF%BC%89/" class="md-tabs__link">
        ICPC题解
      </a>
    </li>
  

      
        
  
  


  
  
  
    <li class="md-tabs__item">
      <a href="../../icpc/%E4%B8%AA%E4%BA%BA%E6%A8%A1%E6%9D%BF/" class="md-tabs__link">
        ICPC模板
      </a>
    </li>
  

      
        
  
  


  <li class="md-tabs__item">
    <a href="../../question/" class="md-tabs__link">
      ICPC题单
    </a>
  </li>

      
        
  
  
    
  


  
  
  
    <li class="md-tabs__item">
      <a href="../%E5%9B%BE%E4%BC%98%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/" class="md-tabs__link md-tabs__link--active">
        课程复习
      </a>
    </li>
  

      
        
  
  


  
  
  
    <li class="md-tabs__item">
      <a href="../../csdn/2020-08-01/" class="md-tabs__link">
        csdn导出
      </a>
    </li>
  

      
        
  
  


  <li class="md-tabs__item">
    <a href="../../plan/" class="md-tabs__link">
      个人计划
    </a>
  </li>

      
        
  
  


  <li class="md-tabs__item">
    <a href="../../about/" class="md-tabs__link">
      关于
    </a>
  </li>

      
    </ul>
  </div>
</nav>
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

  


<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="导航栏" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href="../.." title="Tim-Wcx" class="md-nav__button md-logo" aria-label="Tim-Wcx" data-md-component="logo">
      
  
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19.5 9V1.5h-3V9h-3V1.5h-3V9h-3V1.5H4.65V9H3v1.5h18V9h-1.5m0 4.5h-3V21h-3v-7.5h-3V21h-3v-7.5H4.65V21H3v1.5h18V21h-1.5v-7.5Z"/></svg>

    </a>
    Tim-Wcx
  </label>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      

  
  
  
    
    <li class="md-nav__item md-nav__item--nested">
      
      
      
      
      <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" >
      
      
      
        <label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="0">
          ICPC题解
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
        <label class="md-nav__title" for="__nav_1">
          <span class="md-nav__icon md-icon"></span>
          ICPC题解
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E7%BB%84%E9%98%9F%E8%AE%AD%E7%BB%83%E8%B5%9B%EF%BC%88%E5%9B%9B%EF%BC%89/" class="md-nav__link">
        组队训练赛（四）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E7%BB%84%E9%98%9F%E8%AE%AD%E7%BB%83%E8%B5%9B%EF%BC%88%E4%B8%89%EF%BC%89/" class="md-nav__link">
        组队训练赛（三）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E7%BB%84%E9%98%9F%E8%AE%AD%E7%BB%83%E8%B5%9B%EF%BC%88%E4%BA%8C%EF%BC%89/" class="md-nav__link">
        组队训练赛（二）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E7%BB%84%E9%98%9F%E8%AE%AD%E7%BB%83%E8%B5%9B%EF%BC%88%E4%B8%80%EF%BC%89/" class="md-nav__link">
        组队训练赛（一）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%E4%BA%94%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十五）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%E5%9B%9B%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十四）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%E4%B8%89%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十三）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%E4%BA%8C%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十二）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%E4%B8%80%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十一）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%8D%81%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（十）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E4%B9%9D%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（九）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%85%AB%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（八）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E4%B8%83%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（七）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%85%AD%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（六）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E4%BA%94%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（五）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E5%9B%9B%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（四）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E4%B8%89%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（三）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E7%B3%BB%E5%88%97%E9%A2%98%E8%A7%A3%EF%BC%88%E4%BA%8C%EF%BC%89/" class="md-nav__link">
        暑假集训系列题解（二）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/%E6%9A%91%E5%81%87%E9%9B%86%E8%AE%AD%E9%A2%98%E8%A7%A3%E7%B3%BB%E5%88%97%EF%BC%88%E4%B8%80%EF%BC%89/" class="md-nav__link">
        暑假集训题解系列（一）
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-02-2%E6%9C%882%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-02-2月2日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-07-2%E6%9C%887%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-07-2月7日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-02-2%E6%9C%882%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-02-2月2日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-07-2%E6%9C%887%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-07-2月7日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-08-2%E6%9C%888%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-08-2月8日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-09-2%E6%9C%889%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-09-2月9日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-12-%E5%AE%89%E5%8D%93%E8%AF%BE%E8%A1%A8%E5%AE%A2%E6%88%B7%E7%AB%AF%2B%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B3%A8%E8%A7%A3/" class="md-nav__link">
        2021-02-12-安卓课表客户端+服务端注解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-16-2%E6%9C%8816%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-16-2月16日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-19-2%E6%9C%8819%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-19-2月19日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-20-2%E6%9C%8820%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-20-2月20日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-22-2%E6%9C%8822%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-22-2月22日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-24-2%E6%9C%8824%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-24-2月24日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-02-28-2%E6%9C%8828%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-02-28-2月28日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-03-02-3%E6%9C%882%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-03-02-3月2日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-03-07-3%E6%9C%887%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-03-07-3月7日题解
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-03-09-%E6%95%B0%E8%AE%BA/" class="md-nav__link">
        2021-03-09-数论
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../problem/2021-06-05-6%E6%9C%885%E6%97%A5%E9%A2%98%E8%A7%A3/" class="md-nav__link">
        2021-06-05-6月5日题解
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
      
      
      

  
  
  
    
    <li class="md-nav__item md-nav__item--nested">
      
      
      
      
      <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" >
      
      
      
        <label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
          ICPC模板
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
        <label class="md-nav__title" for="__nav_2">
          <span class="md-nav__icon md-icon"></span>
          ICPC模板
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../icpc/%E4%B8%AA%E4%BA%BA%E6%A8%A1%E6%9D%BF/" class="md-nav__link">
        个人模板
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../icpc/kuangbin%E6%A8%A1%E6%9D%BF/" class="md-nav__link">
        kuangbin模板
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../../question/" class="md-nav__link">
        ICPC题单
      </a>
    </li>
  

    
      
      
      

  
  
    
  
  
    
    <li class="md-nav__item md-nav__item--active md-nav__item--nested">
      
      
      
      
      <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
      
      
      
        <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
          课程复习
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
        <label class="md-nav__title" for="__nav_4">
          <span class="md-nav__icon md-icon"></span>
          课程复习
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E5%9B%BE%E4%BC%98%E7%AE%97%E6%B3%95%E7%AC%94%E8%AE%B0/" class="md-nav__link">
        图优算法笔记
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E5%8D%9A%E6%B5%81WIFI%E8%B5%84%E6%96%99/" class="md-nav__link">
        博流WIFI资料
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/" class="md-nav__link">
        数字图像处理
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E7%8E%B0%E4%BB%A3%E5%AF%86%E7%A0%81%E5%AD%A6/" class="md-nav__link">
        现代密码学
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/" class="md-nav__link">
        软件工程
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6/" class="md-nav__link">
        计算机图形学
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" class="md-nav__link">
        计算机操作系统
      </a>
    </li>
  

            
          
            
              
  
  
    
  
  
    <li class="md-nav__item md-nav__item--active">
      
      <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
      
      
        
      
      
        <label class="md-nav__link md-nav__link--active" for="__toc">
          单片机
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <a href="./" class="md-nav__link md-nav__link--active">
        单片机
      </a>
      
        

<nav class="md-nav md-nav--secondary" aria-label="目录">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      目录
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#3" class="md-nav__link">
    第3章 单片机的结构和原理
  </a>
  
    <nav class="md-nav" aria-label="第3章 单片机的结构和原理">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#51" class="md-nav__link">
    51单片机的基本组成
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#51_1" class="md-nav__link">
    51子系列单片机的存储器配置
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    并行输入/输出端口结构
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#cpu" class="md-nav__link">
    时钟电路与CPU时序
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    复位电路
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#4-mcs-51" class="md-nav__link">
    第4章 MCS-51的指令系统
  </a>
  
    <nav class="md-nav" aria-label="第4章 MCS-51的指令系统">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    计算机语言
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    汇编语言程序语句格式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    寻址方式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    指令系统
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#5-mcs-51" class="md-nav__link">
    第5章   MCS-51的汇编语言程序设计
  </a>
  
    <nav class="md-nav" aria-label="第5章   MCS-51的汇编语言程序设计">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    查表指令
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    散转指令
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    子程序结构：
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#7" class="md-nav__link">
    第7章  中断系统
  </a>
  
    <nav class="md-nav" aria-label="第7章  中断系统">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#io" class="md-nav__link">
    单片机中I/O传送方式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    中断系统结构及中断控制
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    定时/计数器的结构和寄存器
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#8" class="md-nav__link">
    第8章 存储器的扩展
  </a>
  
    <nav class="md-nav" aria-label="第8章 存储器的扩展">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    存储器概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_16" class="md-nav__link">
    单片机的扩展结构
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#i2ci2cat" class="md-nav__link">
    I2C总线及I2C总线的AT存储器扩展
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_17" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#9-mcs-51" class="md-nav__link">
    第9章 MCS-51单片机串行接口
  </a>
  
    <nav class="md-nav" aria-label="第9章 MCS-51单片机串行接口">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_18" class="md-nav__link">
    串行通信概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mcs-51" class="md-nav__link">
    MCS-51单片机串行口
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_19" class="md-nav__link">
    串行通信工作方式
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#10-io" class="md-nav__link">
    第10章 单片机并行I/O接口扩展
  </a>
  
    <nav class="md-nav" aria-label="第10章 单片机并行I/O接口扩展">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#io_1" class="md-nav__link">
    I/O接口技术概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#io_2" class="md-nav__link">
    简单I/O接口的扩展方法
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#intel-8155" class="md-nav__link">
    可编程并行接口芯片Intel 8155
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#ledlcd" class="md-nav__link">
    LED和LCD显示接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_20" class="md-nav__link">
    键盘接口
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_21" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#11-adda" class="md-nav__link">
    第11章  A/D与D/A转换器及接口技术
  </a>
  
    <nav class="md-nav" aria-label="第11章  A/D与D/A转换器及接口技术">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#da" class="md-nav__link">
    D/A转换器及接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dadac0832" class="md-nav__link">
    并行D/A转换器DAC0832简介
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dac0832" class="md-nav__link">
    DAC0832与单片机的接口及编程
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#12dadac1210" class="md-nav__link">
    12位并行D/A转换器DAC1210
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#ad" class="md-nav__link">
    并行A/D转换器及接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#adadc0808adc0809" class="md-nav__link">
    A/D转换器ADC0808和ADC0809
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#12adad574" class="md-nav__link">
    12位并行A/D转换器AD574
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#12" class="md-nav__link">
    第12章 单片机应用系统设计与调试
  </a>
  
    <nav class="md-nav" aria-label="第12章 单片机应用系统设计与调试">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_22" class="md-nav__link">
    单片机系统开发与工具
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_23" class="md-nav__link">
    功率扩展与隔离技术
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
      
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../PDF%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91/" class="md-nav__link">
        PDF划词翻译
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../make/" class="md-nav__link">
        makefile学习笔记
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../RT_Smart%E4%B8%ADminizip%E7%A7%BB%E6%A4%8D%E8%AE%B0%E5%BD%95/" class="md-nav__link">
        RT_Smart中minizip移植记录
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
      
      
      

  
  
  
    
    <li class="md-nav__item md-nav__item--nested">
      
      
      
      
      <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
      
      
      
        <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
          csdn导出
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
        <label class="md-nav__title" for="__nav_5">
          <span class="md-nav__icon md-icon"></span>
          csdn导出
        </label>
        <ul class="md-nav__list" data-md-scrollfix>
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-01/" class="md-nav__link">
        2020-08-01
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-02%E7%BA%BF%E6%AE%B5%E6%A0%91/" class="md-nav__link">
        2020-08-02线段树
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-03/" class="md-nav__link">
        2020-08-03
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-04/" class="md-nav__link">
        2020-08-04
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-05/" class="md-nav__link">
        2020-08-05
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-06%E7%BA%BF%E6%AE%B5%E6%A0%91/" class="md-nav__link">
        2020-08-06线段树
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-07/" class="md-nav__link">
        2020-08-07
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-08/" class="md-nav__link">
        2020-08-08
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-09/" class="md-nav__link">
        2020-08-09
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-10/" class="md-nav__link">
        2020-08-10
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-11/" class="md-nav__link">
        2020-08-11
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-12%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0/" class="md-nav__link">
        2020-08-12欧拉函数
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-13/" class="md-nav__link">
        2020-08-13
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-14/" class="md-nav__link">
        2020-08-14
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-16%E6%A0%91%E5%BD%A2DP%E7%AD%89%E5%B7%AE%E6%95%B0%E5%88%97%E5%89%8D%E7%BC%80%E5%92%8C/" class="md-nav__link">
        2020-08-16树形DP等差数列前缀和
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-17/" class="md-nav__link">
        2020-08-17
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-18/" class="md-nav__link">
        2020-08-18
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-19/" class="md-nav__link">
        2020-08-19
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-20/" class="md-nav__link">
        2020-08-20
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-08-21/" class="md-nav__link">
        2020-08-21
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-05%E5%88%92%E5%88%86%E6%A0%91%E6%B1%82%E6%9F%90%E4%B8%80%E5%8C%BA%E9%97%B4%E7%9A%84%E4%B8%AD%E4%BD%8D%E6%95%B0/" class="md-nav__link">
        2020-09-05划分树求某一区间的中位数
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-07/" class="md-nav__link">
        2020-09-07
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-08%E4%BA%8C%E5%88%86%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/" class="md-nav__link">
        2020-09-08二分最小生成树
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-08%E6%95%B0%E4%BD%8DDP%E4%BA%8C%E5%88%86/" class="md-nav__link">
        2020-09-08数位DP二分
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-09%E6%95%B0%E4%BD%8DDP/" class="md-nav__link">
        2020-09-09数位DP
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-11%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84%E6%B1%82%E6%9C%80%E5%A4%A7%E5%80%BC/" class="md-nav__link">
        2020-09-11树状数组求最大值
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-12%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C/" class="md-nav__link">
        2020-09-12字符串哈希
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-12/" class="md-nav__link">
        2020-09-12
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-21%E5%87%B8%E5%8C%85%E7%AE%97%E6%B3%95/" class="md-nav__link">
        2020-09-21凸包算法
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-23%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/" class="md-nav__link">
        2020-09-23树状数组
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-09-26%E6%9C%80%E5%B0%8F%E8%B4%B9%E7%94%A8%E6%9C%80%E5%A4%A7%E6%B5%81%E9%97%AE%E9%A2%98/" class="md-nav__link">
        2020-09-26最小费用最大流问题
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-10-04%E7%BA%BF%E6%AE%B5%E6%A0%91%E6%89%AB%E6%8F%8F%E7%BA%BF/" class="md-nav__link">
        2020-10-04线段树扫描线
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-10-05/" class="md-nav__link">
        2020-10-05
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-10-07%E5%B9%B6%E6%9F%A5%E9%9B%86%E5%90%AF%E5%8F%91%E5%BC%8F%E5%90%88%E5%B9%B6/" class="md-nav__link">
        2020-10-07并查集启发式合并
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-10-15dsuontree/" class="md-nav__link">
        2020-10-15dsuontree
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-11-23/" class="md-nav__link">
        2020-11-23
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-12-02/" class="md-nav__link">
        2020-12-02
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2020-7-31/" class="md-nav__link">
        2020-7-31
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2021-02-02/" class="md-nav__link">
        2021-02-02
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/2021-02-24/" class="md-nav__link">
        2021-02-24
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/Beyond_compare4_30%E5%A4%A9%E8%AF%95%E7%94%A8%E8%BF%87%E6%9C%9F/" class="md-nav__link">
        Beyondcompare430天试用过期
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/GitHub%E5%8D%9A%E5%AE%A2/" class="md-nav__link">
        GitHub博客
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E4%BA%8C%E5%88%86%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E6%A8%A1%E6%9D%BF/" class="md-nav__link">
        二分二分查找模板
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E5%BC%82%E6%88%96%E6%B1%82%E5%92%8C%E5%BC%8F/" class="md-nav__link">
        异或求和式
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E6%B1%82%E7%BB%84%E5%90%88%E6%95%B0%E7%9A%84%E6%96%B9%E6%B3%95/" class="md-nav__link">
        求组合数的方法
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E6%B1%82%E9%80%86%E5%BA%8F%E5%AF%B9/" class="md-nav__link">
        求逆序对
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E7%AE%80%E4%BB%8B%E6%89%A9%E5%B1%95%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%B7%E5%AE%9A%E7%90%86/" class="md-nav__link">
        简介扩展欧几里德定理
      </a>
    </li>
  

            
          
            
              
  
  
  
    <li class="md-nav__item">
      <a href="../../csdn/%E9%93%BE%E8%A1%A8/" class="md-nav__link">
        链表
      </a>
    </li>
  

            
          
        </ul>
      </nav>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../../plan/" class="md-nav__link">
        个人计划
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../../about/" class="md-nav__link">
        关于
      </a>
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
              
              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

<nav class="md-nav md-nav--secondary" aria-label="目录">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      目录
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#3" class="md-nav__link">
    第3章 单片机的结构和原理
  </a>
  
    <nav class="md-nav" aria-label="第3章 单片机的结构和原理">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#51" class="md-nav__link">
    51单片机的基本组成
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#51_1" class="md-nav__link">
    51子系列单片机的存储器配置
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    并行输入/输出端口结构
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#cpu" class="md-nav__link">
    时钟电路与CPU时序
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    复位电路
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#4-mcs-51" class="md-nav__link">
    第4章 MCS-51的指令系统
  </a>
  
    <nav class="md-nav" aria-label="第4章 MCS-51的指令系统">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    计算机语言
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    汇编语言程序语句格式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    寻址方式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    指令系统
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#5-mcs-51" class="md-nav__link">
    第5章   MCS-51的汇编语言程序设计
  </a>
  
    <nav class="md-nav" aria-label="第5章   MCS-51的汇编语言程序设计">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    查表指令
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    散转指令
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    子程序结构：
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#7" class="md-nav__link">
    第7章  中断系统
  </a>
  
    <nav class="md-nav" aria-label="第7章  中断系统">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#io" class="md-nav__link">
    单片机中I/O传送方式
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    中断系统结构及中断控制
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    定时/计数器的结构和寄存器
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#8" class="md-nav__link">
    第8章 存储器的扩展
  </a>
  
    <nav class="md-nav" aria-label="第8章 存储器的扩展">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    存储器概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_16" class="md-nav__link">
    单片机的扩展结构
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#i2ci2cat" class="md-nav__link">
    I2C总线及I2C总线的AT存储器扩展
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_17" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#9-mcs-51" class="md-nav__link">
    第9章 MCS-51单片机串行接口
  </a>
  
    <nav class="md-nav" aria-label="第9章 MCS-51单片机串行接口">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_18" class="md-nav__link">
    串行通信概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#mcs-51" class="md-nav__link">
    MCS-51单片机串行口
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_19" class="md-nav__link">
    串行通信工作方式
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#10-io" class="md-nav__link">
    第10章 单片机并行I/O接口扩展
  </a>
  
    <nav class="md-nav" aria-label="第10章 单片机并行I/O接口扩展">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#io_1" class="md-nav__link">
    I/O接口技术概述
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#io_2" class="md-nav__link">
    简单I/O接口的扩展方法
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#intel-8155" class="md-nav__link">
    可编程并行接口芯片Intel 8155
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#ledlcd" class="md-nav__link">
    LED和LCD显示接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_20" class="md-nav__link">
    键盘接口
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_21" class="md-nav__link">
    小结
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#11-adda" class="md-nav__link">
    第11章  A/D与D/A转换器及接口技术
  </a>
  
    <nav class="md-nav" aria-label="第11章  A/D与D/A转换器及接口技术">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#da" class="md-nav__link">
    D/A转换器及接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dadac0832" class="md-nav__link">
    并行D/A转换器DAC0832简介
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#dac0832" class="md-nav__link">
    DAC0832与单片机的接口及编程
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#12dadac1210" class="md-nav__link">
    12位并行D/A转换器DAC1210
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#ad" class="md-nav__link">
    并行A/D转换器及接口技术
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#adadc0808adc0809" class="md-nav__link">
    A/D转换器ADC0808和ADC0809
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#12adad574" class="md-nav__link">
    12位并行A/D转换器AD574
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#12" class="md-nav__link">
    第12章 单片机应用系统设计与调试
  </a>
  
    <nav class="md-nav" aria-label="第12章 单片机应用系统设计与调试">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_22" class="md-nav__link">
    单片机系统开发与工具
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_23" class="md-nav__link">
    功率扩展与隔离技术
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
                  </div>
                </div>
              </div>
            
          
          
            <div class="md-content" data-md-component="content">
              <article class="md-content__inner md-typeset">
                
                  


<h1 id="_1">单片机复习<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<h3 id="3">第3章 单片机的结构和原理<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<h4 id="51">51单片机的基本组成<a class="headerlink" href="#51" title="Permanent link">&para;</a></h4>
<p><img alt="image-20220607190521599" src="https://pic.tim-wcx.ltd/2022/06/07/629f310419d0c.png" /></p>
<p>​   XTAL1、XTAL2：晶振  </p>
<p>​   PSEN: 片外程序存储器读选通信号输出端, 低电平有效。 </p>
<p>​   EA：片外程序存储器读选通信号输出端, 低电平有效。 </p>
<p>​   RST：复位信号</p>
<p>​   ALE：地址锁存信号</p>
<p>​   RXD：串行数据接收</p>
<p>​   TXD：串行数据发送</p>
<p>​   INT0：外部中断0请求输入线</p>
<p>​   INT1：外部中断1请求输入线</p>
<p>​   T0：定时器/计数器0计数输入线</p>
<p>​   T1：定时器/计数器1计数输入线</p>
<p>​   WE：外部RAM写信号</p>
<p>​   RD：外部RAM读信号</p>
<p>​   P0：地址/数据总线，<strong>准双向IO</strong></p>
<p>​   P1：<strong>准双向IO</strong></p>
<p>​   P2：地址总线，<strong>准双向IO</strong></p>
<p>​   P3：控制总线，<strong>准双向IO</strong></p>
<h4 id="51_1">51子系列单片机的存储器配置<a class="headerlink" href="#51_1" title="Permanent link">&para;</a></h4>
<p>1、8051存储器地址空间</p>
<ol>
<li>
<p>片内、片外统一编址的程序存贮器ROM：64KB，地址：0000～0FFFFH；</p>
<p>(低4KB，EA==0时外部ROM，否则内部ROM)</p>
<p>MOVC指令访问</p>
<p>PSEN片选读信号</p>
</li>
<li>
<p>片外数据存贮器RAM：64KB，地址：0000～0FFFFH；</p>
<p>MOVX指令访问</p>
<p>RD和WR信号</p>
</li>
<li>
<p>内部数据存贮器RAM：256B，地址：0~0FFH。</p>
<p>MOV指令访问</p>
</li>
</ol>
<p>2、ROM芯片</p>
<p>用途： 用于存放编好的程序和表格常数。</p>
<table>
<thead>
<tr>
<th>保留单元地址</th>
<th>入 口  地 址</th>
<th>用  途</th>
</tr>
</thead>
<tbody>
<tr>
<td>0000H～0002H</td>
<td>0000H</td>
<td>复位后初始化引导程序</td>
</tr>
<tr>
<td>0003H～000AH</td>
<td>0003H</td>
<td>外部中断0中断服务程序</td>
</tr>
<tr>
<td>000BH～0012H</td>
<td>000BH</td>
<td>定时/计数器0中断服务程序</td>
</tr>
<tr>
<td>0013H～001AH</td>
<td>0013H</td>
<td>外部中断1中断服务程序</td>
</tr>
<tr>
<td>001BH～0022H</td>
<td>001BH</td>
<td>定时/计数器1中断服务程序</td>
</tr>
<tr>
<td>0023H～002AH</td>
<td>0023H</td>
<td>串行口中断服务程序</td>
</tr>
<tr>
<td>002BH～0032H</td>
<td>002BH</td>
<td>定时/计数器2中断服务程序(52子系列才有)</td>
</tr>
</tbody>
</table>
<p>3、RAM芯片</p>
<p>用途：用于存放运算的中间结果、数据暂存和缓冲、标志位等。</p>
<p>分类：片内RAM： 256字节；地址从0000～00FFH；片外RAM： 64K字节；地址从0000～FFFFH。</p>
<p>片内RAM：高128单元80H~0FFH SFR</p>
<p>​                   低128单元00H~7FH 真正的RAM</p>
<p><img alt="内部RAM" src="https://pic.tim-wcx.ltd/2022/06/08/62a01f2d26aa5.png" /></p>
<p>3.1 低128单元：</p>
<p>1）存储器区：四组寄存器，每组8个寄存单元（8位），各组都以R0、R1、R2、R3、R4、R5、R6、R7作寄存单元编号。寄存器常用于存放操作数及中间结果等，由于它们的功能及使用不作预先规定因此称之为通用寄存器，有时也叫工作寄存器、四组通用寄存器占据内部RAM的00H～1FH单元地址。</p>
<p>在任一时刻，CPU只能使用其中的一组寄存器，并且把正在使用的那组寄存器称之为当前寄存器组。到底是那一组由程序状态字寄存器PSW中RS0、RS1位的状态组合来决定。</p>
<p>R0～R7寄存器与内部RAM的地址对应</p>
<table>
<thead>
<tr>
<th>通用寄存器  名称</th>
<th>地  址</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>第0组</td>
<td>第1组</td>
<td>第2组</td>
<td>第3组</td>
<td></td>
</tr>
<tr>
<td>R0</td>
<td>00H</td>
<td>08H</td>
<td>10H</td>
<td>18H</td>
</tr>
<tr>
<td>R1</td>
<td>01H</td>
<td>09H</td>
<td>11H</td>
<td>19H</td>
</tr>
<tr>
<td>R2</td>
<td>02H</td>
<td>0AH</td>
<td>12H</td>
<td>1AH</td>
</tr>
<tr>
<td>R3</td>
<td>03H</td>
<td>0BH</td>
<td>13H</td>
<td>1BH</td>
</tr>
<tr>
<td>R4</td>
<td>04H</td>
<td>0CH</td>
<td>14H</td>
<td>1CH</td>
</tr>
<tr>
<td>R5</td>
<td>05H</td>
<td>0DH</td>
<td>15H</td>
<td>1DH</td>
</tr>
<tr>
<td>R6</td>
<td>06H</td>
<td>0EH</td>
<td>16H</td>
<td>1EH</td>
</tr>
<tr>
<td>R7</td>
<td>07H</td>
<td>0FH</td>
<td>17H</td>
<td>1FH</td>
</tr>
</tbody>
</table>
<p>2） 位寻址区：</p>
<p>地址：20H～2FH单元，共128位。</p>
<p>位地址：00H～7FH。</p>
<p>性质：既可作为一般RAM单元使用进行字节操作，也可以对单元中的每一位进行位操作，因此把该区称之为位寻址区。</p>
<p>3） 用户RAM区：</p>
<p>单元地址为30H～7FH，主要的数据缓冲区。</p>
<p>把堆栈开辟在此区。</p>
<p>3.2 高128单元：</p>
<p>特殊功能寄存器区、专用寄存器区 简称SFR。</p>
<p>单元地址：80H～FFH。</p>
<p>（1）累加器A或ACC（Accumulator）<mark>0E0H</mark></p>
<p>8位寄存器，是最常用的专用寄存器</p>
<p>大部分单操作数指令的操作数就取自ACC，许多双操作数指令中的一个操作数也取自累加器。</p>
<p>（2） B寄存器 <mark>0F0H</mark></p>
<p>8位寄存器，主要用于乘除运算。如 MUL   AB</p>
<p>B寄存器也可作为一般数据寄存器使用。如MOV  B, #20H</p>
<p>（3） 数据指针（DPTR）16位寄存器</p>
<p>MCS-51中唯一的一个16位寄存器。</p>
<p>DPH：DPTR高位字节 <mark>83H</mark></p>
<p>DPL：DPTR低位字节 <mark>82H</mark></p>
<p>作用：通常在访问外部RAM时作地址指针使用, 由于外部数据存储器的寻址范围64KB。</p>
<p>DPTR既可按16位寄存器使用，也可以按两个8位寄存器分开使用。如： </p>
<p>MOV   DPTR， #1234H  &lt;==&gt; MOV    DPH， #12H；MOV   DPL，  #34H</p>
<p>（4）程序计数器PC（Program Counter）</p>
<p>PC：16位的计数器。</p>
<p>其内容为将要执行的指令地址，寻址范围达64KB。  </p>
<p>有自动加 1功能，从而实现程序的顺序执行、 但PC没有地址，是不可寻址的、因此无法对它进行读写。但可以通过转移、调用、返回等指令改变其内容，以实现程序的转移。</p>
<p>（5）I/O端口P0～P3==（80H，90H，A0H，B0H）==</p>
<p>P0～P3为四个8位特殊功能寄存器，分别是四个并行I/O端口的锁存器。它们都有字节地址，每一个口锁存器还有位地址，所以当每一条I/O线独立地用作输入或输出时，数据可以锁存；作输入时，数据可以缓冲。</p>
<p>当I/O端口某一位用于输入信号时，对应的锁存器必须先置“1”。RST初始化为FFH</p>
<p>（6）程序状态字PSW（Program Status Word） <mark>0D0H</mark></p>
<p>8位寄存器，用于寄存程序运行的状态信息。</p>
<p>其中：有些位状态是根据程序执行结果，由硬件自动设置的而有些位状态则使用软件方法设定．</p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th align="center">D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>CY</td>
<td>AC</td>
<td>F0</td>
<td>RS1</td>
<td align="center">RS0</td>
<td>OV</td>
<td>...</td>
<td>P</td>
</tr>
<tr>
<td>进位标志位</td>
<td>辅助进位标志位</td>
<td>用户标志位</td>
<td>寄存器组选择位</td>
<td align="center">寄存器组选择位</td>
<td>溢出标志位</td>
<td></td>
<td>奇偶标志位</td>
</tr>
<tr>
<td>有进位/借位，CY=1，否则，CY=0</td>
<td>低4位向高4位的进位或借位。有AC=1，否则AC=0。</td>
<td>需要时用软件方法置位或复位，用以控制程序的转向。</td>
<td></td>
<td align="center"></td>
<td>8位带符号数字加减运算结果是否超出运算范围。8位有符号数字表示的范围：－128～＋127。OV＝0，运算正确，即无溢出产生。在乘法运算中，OV＝1，表示乘积超过255；在除法运算中，OV＝1，表示除数为0，除法不能进行。</td>
<td></td>
<td>表明累加器A中1个个数的奇偶性，奇1偶0（串行输入输出的第9位）</td>
</tr>
</tbody>
</table>
<p>（7）PCON 电源控制  <mark>87H</mark></p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th>D3</th>
<th>D2</th>
<th>D1</th>
<th align="center">D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>SMOD</td>
<td>(SMOD0)</td>
<td>(LVDF)</td>
<td>(P0F)</td>
<td>GF1</td>
<td>GF0</td>
<td>PD</td>
<td align="center">IDL</td>
</tr>
<tr>
<td>与串口通信有关</td>
<td>单片机特有</td>
<td>单片机特有</td>
<td>单片机特有</td>
<td>通用工作标志位，用户可以自由使用。</td>
<td>通用工作标志位，用户可以自由使用。</td>
<td>掉电模式设定位。</td>
<td align="center">空闲模式设定位。</td>
</tr>
<tr>
<td>SMOD=0; 串口方式1，2，3时，波特率正常。SMOD=1; 串口方式1，2，3时，波特率加倍。</td>
<td>\</td>
<td>\</td>
<td>\</td>
<td>\</td>
<td>\</td>
<td>PD=0 单片机处于正常工作状态。PD=1 单片机进入掉电(Power Down)模式，可由外部中断或硬件复位模式唤醒，进入掉电模式后，外部晶振停振，CPU、定时器、串行口全部停止工作，只有外部中断工作。</td>
<td align="center">IDL=0 单片机处于正常工作状态。IDL=1 单片机进入空闲(Idle)模式，除CPU不工作外，其余仍继续工作，在空闲模式下可由任一个中断或硬件复位唤醒。</td>
</tr>
</tbody>
</table>
<p>（7）TCON 时钟控制  <mark>8FH~88H</mark> <mark>88H</mark></p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th align="center">D5</th>
<th>D4</th>
<th>D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>TF1</td>
<td>TR1</td>
<td align="center">TF0</td>
<td>TR0</td>
<td>IE1</td>
<td>IT1</td>
<td>IE0</td>
<td>IT0</td>
</tr>
<tr>
<td>T1溢出标志位</td>
<td>定时计数器1控制位</td>
<td align="center">T0溢出标志位</td>
<td>定时计数器0控制位</td>
<td>外部中断INT1请求中断标志位</td>
<td>外部中断INT1触发方式控制位</td>
<td>外部中断0请求中断标志位</td>
<td>外部中断INT0触发方式控制位</td>
</tr>
<tr>
<td>TF1=1表示T1有中断产生（硬件控制）当转向中断服务时，再由硬件自动清0。</td>
<td>TR1=1表示T1开始运行</td>
<td align="center">TF0=1表示T0有中断产生（硬件控制）当转向中断服务时，再由硬件自动清0。</td>
<td>TR0=1表示T0开始运行</td>
<td>IE1=1，INT1有中断产生（硬件控制）在中断响应完成后转向中断服务时，再由硬件自动清零。</td>
<td>IT1=1时，INT1为跳变沿触发方式，后沿负跳有效；IT1=0时，INT1为电平方式，低电平有效。</td>
<td>IE1=1，INT0有中断产生(硬件控制)在中断响应完成后转向中断服务时，再由硬件自动清零。</td>
<td>IT0=1时，INT0为跳变沿触发方式，后沿负跳有效；IT0=0时，INT0为电平方式，低电平有效。</td>
</tr>
</tbody>
</table>
<p>（8）定时器TMOD  <mark>89H</mark></p>
<p>TMOD寄存器不能位寻址，只能用字节传送指令设置其内容。 复位后，TMOD＝0。</p>
<p>当GATE＝0时，若TR0=1，接通计数控制K，启动T0在原计数值上加1计数，直至溢出。若TR0＝0，则关断控制开关，停止计数。将此方式称为软件启动。</p>
<p>当GATE＝1，且TR0＝1时，或门、与门全部打开，外信号电平通过INT0引脚直接开启或关断定时器计数。输入1电平时，允许计数，否则停止计数。称为硬件启动。</p>
<table>
<thead>
<tr>
<th>定时器1</th>
<th></th>
<th align="center"></th>
<th></th>
<th>定时器0</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>7</td>
<td>6</td>
<td align="center"><em>5</em></td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>GATE</td>
<td>C/T</td>
<td align="center">M1</td>
<td>M0</td>
<td>GATE</td>
<td>C/T</td>
<td>M1</td>
<td>M0</td>
</tr>
<tr>
<td>门控制</td>
<td>C/T=0，定时器模式。C/T=1，计数器模式。</td>
<td align="center">用来选择定时计/计数器的工作方式</td>
<td>用来选择定时计/计数器的工作方式</td>
<td>门控制</td>
<td>C/T=0，定时器模式。C/T=1，计数器模式。</td>
<td>用来选择定时计/计数器的工作方式</td>
<td>用来选择定时计/计数器的工作方式</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>M1</th>
<th>M0</th>
<th>工作方式</th>
<th>功能描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>方式0</td>
<td>13位计数器</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>方式1</td>
<td>16位计数器</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>方式2</td>
<td>自动再装入8位计数器</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>方式3</td>
<td>定时器0：分为两个8位计数器，定时器1：停止计数</td>
</tr>
</tbody>
</table>
<p>（9）总中断允许IE  <mark>0AFH~0A8H</mark> <mark>A8H</mark></p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th align="center">D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>EA</td>
<td>-</td>
<td>-</td>
<td>ES</td>
<td align="center">ET1</td>
<td>EX1</td>
<td>ET0</td>
<td>EX0</td>
</tr>
<tr>
<td>总允许位</td>
<td></td>
<td></td>
<td>串行口中断允许位</td>
<td align="center">定时器T1溢出中断允许位</td>
<td>外部中断1允许位</td>
<td>定时器T0溢出中断允许位</td>
<td>外部中断 INT0允许位</td>
</tr>
<tr>
<td>EA=1，CPU开放中断</td>
<td></td>
<td></td>
<td>ES=1，允许串行口中断</td>
<td align="center">ET1=1，允许T1中断</td>
<td>EX1=1，允许外部中断1中断</td>
<td>ET0=1，允许T0中断</td>
<td>EX0=1，允许外部中断0中断</td>
</tr>
</tbody>
</table>
<p>（9）串行控制位SCON <mark>9FH~98H</mark> <mark>98H</mark></p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th align="center">D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>SM0</td>
<td>SM1</td>
<td>SM2</td>
<td>REN</td>
<td align="center">TB8</td>
<td>RB8</td>
<td>T1</td>
<td>R1</td>
</tr>
<tr>
<td>工作方式选择位</td>
<td>工作方式选择位</td>
<td>多机通信控制位，主要用于方式2和方式3。</td>
<td>允许串行接收位。</td>
<td align="center">在方式2或方式3中，是发送数据的第九位，可以用软件规定其作用。</td>
<td>在方式2或方式3中，是接收到数据的第九位，作为奇偶校验位或地址帧/数据帧的标志位。在方式1时，若SM2=0，则RB8是接收到的停止位。</td>
<td>串行口发送中断请求标志位</td>
<td>串行口接收中断请求标志位</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>允许串行接收控制位。由软件置1或清0。REN=1时，允许接收；REN=0时，禁止接收。</td>
<td align="center"></td>
<td></td>
<td>当发送完一帧串行数据后，由硬件置1，在转向中断服务程序后，用软件清0。</td>
<td>当接收完一帧串行数据后，由硬件置1；在转向中断服务程序后，用软件清0。</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>SM0 SM1</th>
<th>工作方式</th>
<th>功能说明</th>
<th>波特率</th>
</tr>
</thead>
<tbody>
<tr>
<td>0   0</td>
<td>方式0</td>
<td>同步移位寄存器，用于I/O扩展</td>
<td><span class="arithmatex"><span class="MathJax_Preview">\frac{f_{soc}}{12}</span><script type="math/tex">\frac{f_{soc}}{12}</script></span></td>
</tr>
<tr>
<td>0   1</td>
<td>方式1</td>
<td>10位异步收发器</td>
<td><span class="arithmatex"><span class="MathJax_Preview">\frac{2^{smod}}{32}*T1溢出率, T1溢出率=\frac{f_{osc}}{(2^n-计数器初值)*12}</span><script type="math/tex">\frac{2^{smod}}{32}*T1溢出率, T1溢出率=\frac{f_{osc}}{(2^n-计数器初值)*12}</script></span></td>
</tr>
<tr>
<td>1   0</td>
<td>方式2</td>
<td>11位异步收发器</td>
<td><span class="arithmatex"><span class="MathJax_Preview">\frac{2^{smod}}{64}*f_{osc}</span><script type="math/tex">\frac{2^{smod}}{64}*f_{osc}</script></span></td>
</tr>
<tr>
<td>1   1</td>
<td>方式3</td>
<td>11位异步收发器</td>
<td><span class="arithmatex"><span class="MathJax_Preview">\frac{2^{smod}}{32}*T1溢出率, T1溢出率=\frac{f_{osc}}{(2^n-计数器初值)*12}</span><script type="math/tex">\frac{2^{smod}}{32}*T1溢出率, T1溢出率=\frac{f_{osc}}{(2^n-计数器初值)*12}</script></span></td>
</tr>
</tbody>
</table>
<p>（10）定时器/计数器/串行数据</p>
<table>
<thead>
<tr>
<th>符号</th>
<th>地址</th>
<th>功能介绍</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>TH1</strong></td>
<td>8DH</td>
<td>定时器/计数器1（高8位）</td>
</tr>
<tr>
<td><strong>TH0</strong></td>
<td>8CH</td>
<td>定时器/计数器1（低8位）</td>
</tr>
<tr>
<td><strong>TL1</strong></td>
<td>8BH</td>
<td>定时器/计数器0（高8位）</td>
</tr>
<tr>
<td><strong>TL0</strong></td>
<td>8AH</td>
<td>定时器/计数器0（低8位）</td>
</tr>
<tr>
<td><strong>SBUF</strong></td>
<td>99H</td>
<td>串行口锁存器（两个，写和读）</td>
</tr>
</tbody>
</table>
<p>（11）中断优先级控制寄存器IP <mark>0BFH~0B8H</mark></p>
<table>
<thead>
<tr>
<th>D7</th>
<th>D6</th>
<th>D5</th>
<th>D4</th>
<th align="center">D3</th>
<th>D2</th>
<th>D1</th>
<th>D0</th>
</tr>
</thead>
<tbody>
<tr>
<td>/</td>
<td>/</td>
<td>/</td>
<td>PS</td>
<td align="center">PT1</td>
<td>PX1</td>
<td>PT0</td>
<td>PX0</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>串行中断优先级设定位</td>
<td align="center">定时中断1优先级设定位</td>
<td>外部中断l优先级设定位</td>
<td>定时中断0优先级设定位</td>
<td>外部中断0优先级设定位</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>X =0,  优先级为低；X=1, 优先级为高。</td>
<td align="center">X =0,  优先级为低；X=1, 优先级为高。</td>
<td>X =0,  优先级为低；X=1, 优先级为高。</td>
<td>X =0,  优先级为低；X=1, 优先级为高。</td>
<td>X =0,  优先级为低；X=1, 优先级为高。</td>
</tr>
</tbody>
</table>
<p>（12）堆栈指针SP <mark>81H</mark></p>
<p>堆栈：只允许在其一端进行数据插入和数据删除操作的线性表。RST初始化为07H。</p>
<p>堆栈是为子程序调用和中断操作而设立的。</p>
<p>堆栈的功能：保护断点和保护现场，保护断点：  PC，保护现场：寄存器中的内容。</p>
<p>传送数据方式：入栈：PUSH 出栈：POP。堆栈操作的最大特点：“后进先出”。</p>
<p>堆栈要求：具有足够的容量（或者说足够的堆栈深度）。</p>
<p>堆栈开辟：</p>
<p>1）外堆栈：在主存储器中开辟堆栈．例如8080，Z80等早期的微型机。主要优点是堆栈容量大。但外堆栈的操作速度较慢。</p>
<p>2）内堆栈：在CPU芯片内部存储器中开辟。MCS－51的堆栈就是开辟在内部RAM中。
点是操作速度快，但堆栈容量有限。</p>
<p>堆栈使用方式：</p>
<p>1)：自动方式：（保护断点） </p>
<p>在调用子程序或中断时，返回地址（断点）自动进栈。程序返回时，断点再自动弹回PC.</p>
<p>操作的特点：堆栈操作无需用户干预--  自动方式。</p>
<p>2)：指令方式（保护现场）</p>
<p>进栈指令:  PUSH出栈指令:  POP。</p>
<p><mark>递增满堆栈</mark></p>
<p>（13）汇总</p>
<table>
<thead>
<tr>
<th><strong>符号</strong></th>
<th><strong>地址</strong></th>
<th><strong>功能介绍</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>B</strong></td>
<td>F0H</td>
<td>B寄存器</td>
</tr>
<tr>
<td><strong>ACC</strong></td>
<td>E0H</td>
<td>累加器</td>
</tr>
<tr>
<td><strong>PSW</strong></td>
<td>D0H</td>
<td>程序状态字</td>
</tr>
<tr>
<td><strong>IP</strong></td>
<td>B8H</td>
<td>中断优先级控制寄存器</td>
</tr>
<tr>
<td><strong>P3</strong></td>
<td>B0H</td>
<td>P3口锁存器</td>
</tr>
<tr>
<td><strong>IE</strong></td>
<td>A8H</td>
<td>中断允许控制寄存器</td>
</tr>
<tr>
<td><strong>P2</strong></td>
<td>A0H</td>
<td>P2口锁存器</td>
</tr>
<tr>
<td><strong>SBUF</strong></td>
<td>99H</td>
<td>串行口锁存器</td>
</tr>
<tr>
<td><strong>SCON</strong></td>
<td>98H</td>
<td>串行口控制寄存器</td>
</tr>
<tr>
<td><strong>P1</strong></td>
<td>90H</td>
<td>P1口锁存器</td>
</tr>
<tr>
<td><strong>TH1</strong></td>
<td>8DH</td>
<td>定时器/计数器1（高8位）</td>
</tr>
<tr>
<td><strong>TH0</strong></td>
<td>8CH</td>
<td>定时器/计数器1（低8位）</td>
</tr>
<tr>
<td><strong>TL1</strong></td>
<td>8BH</td>
<td>定时器/计数器0（高8位）</td>
</tr>
<tr>
<td><strong>TL0</strong></td>
<td>8AH</td>
<td>定时器/计数器0（低8位）</td>
</tr>
<tr>
<td><strong>TMOD</strong></td>
<td>89H</td>
<td>定时器/计数器方式控制寄存器</td>
</tr>
<tr>
<td><strong>TCON</strong></td>
<td>88H</td>
<td>定时器/计数器控制寄存器</td>
</tr>
<tr>
<td><strong>DPH</strong></td>
<td>83H</td>
<td>数据地址指针（高8位）</td>
</tr>
<tr>
<td><strong>DPL</strong></td>
<td>82H</td>
<td>数据地址指针（低8位）</td>
</tr>
<tr>
<td><strong>SP</strong></td>
<td>81H</td>
<td>堆栈指针</td>
</tr>
<tr>
<td><strong>P0</strong></td>
<td>80H</td>
<td>P0口锁存器</td>
</tr>
<tr>
<td><strong>PCON</strong></td>
<td>87H</td>
<td>电源控制寄存器</td>
</tr>
<tr>
<td>&gt; 注：SFR可以位寻址的要求为地址以0或8结尾。</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h4 id="_2">并行输入/输出端口结构<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4>
<p>1、P0口</p>
<p>I/O口应用时：“控制”=0；数据/地址时：“控制”=1。</p>
<p>用作输入口时，需先给P0.x口输出高电平。MOV  P0， #0FFH</p>
<p><img alt="P0口结构" src="https://pic.tim-wcx.ltd/2022/06/07/629f3b307d160.png" /></p>
<p>2、P1口</p>
<p>当用作输入时，必须先输出1；P1口为准双向口；外接电路一般采用共阳极。</p>
<p><img alt="P1口结构" src="https://pic.tim-wcx.ltd/2022/06/07/629f3b418eafb.png" /></p>
<h4 id="cpu">时钟电路与CPU时序<a class="headerlink" href="#cpu" title="Permanent link">&para;</a></h4>
<p>时钟电路：用于产生单片机工作所需要的时钟信号；</p>
<p>时序：指令执行中各信号之间的相互关系。</p>
<p>1、时钟电路
(1) 内部时钟方式</p>
<p>​   芯片内部的高增益反向放大器和在引脚XTAL1和XTAL2两端跨接晶体振荡器和微调电容，就构成了一个稳定的自激振荡器，其发出的脉冲直接输入单片机的内部时钟电路。</p>
<p>(2)  外部时钟方式</p>
<p>​   HMOS和CHMOS型单片机的外部时钟电路</p>
<p>​   HMOS XTAL2--OUT时钟源 XTAL1---地</p>
<p>​   CHMOS XTAL2--悬空 XTAL1--OUT时钟源</p>
<p>2、CPU时序</p>
<p>MCS-51的时序定时单位共有4个，从小到大依次是：拍节，状态、机器周期、指令周期。</p>
<p>(1) 拍节与状态</p>
<p>拍节（P）：振荡脉冲的周期，又称振荡周期。</p>
<p>状态（S）:  时钟信号的周期，又称时钟周期。</p>
<p>关系：振荡频率＝2倍时钟频率</p>
<p>​            时钟周期＝2倍振荡周期，</p>
<p>即  1S=2P（拍节1（P1），拍节2（P2））。</p>
<p>(2) 机器周期</p>
<p>机器周期: 指CPU访问存储器一次所需要的时间。例如取指令，读存储器、写存储器等。</p>
<p>MCS-51的一个机器周期包括12个振荡周期（12P）＝6S</p>
<p>即6个状态：S1～S6。</p>
<p>而每个状态又分为两拍，称为P1和P2。</p>
<p>因此，一个机器周期中的12个振荡周期表示为S1P1、S1P2、S2P1……、S6P2。</p>
<p>(3) 指令周期</p>
<p>定义： 执行一条指令所需要的时间称之为指令周期。</p>
<p>最大的时序定时单位，无固定值。</p>
<p>指令不同，指令周期不同。</p>
<p>MCS-51的指令包含一、二、四个机器周期。</p>
<p>例如: 外接晶振频率fOSC为12 MHz时, MCS—51单片机的4个时间周期值为: </p>
<p>​            振荡周期  P=1/fosc＝1/12 μs; </p>
<p>​            状态周期  S=2P＝&#8537; μs; </p>
<p>​            机器周期  =6S＝12P＝1 μs;</p>
<p>​            指令周期  =1、2、4 μs。</p>
<p>3、典型指令的时序</p>
<p>根据指令代码所占的字节不同：单字节、双字节、三字节。</p>
<p>根据指令执行时间的不同：单机器周期、双机器周期四机器周期。</p>
<p>执行指令的两个阶段：取指令和执行指令。</p>
<p>ALE：地址锁存允许信号，每有效一次对应单片机进行的一次读指令操作， 取指有效时间：S1P2和S2P1，S4P2和S5P1。ALE出现频率为振荡脉冲频率的&#8537;。S1P2和S2P1为访问存储器取指、S4P2和S5P1为访问存储器执行读或写操作数。</p>
<h4 id="_3">复位电路<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4>
<p>1、复位： 单片机的初始化操作。</p>
<p>复位的功能：</p>
<p>（1） 进入系统的正常初始化； （PC）＝0000H， 单片机从0000H单元执行程序；</p>
<p>（2） 使系统摆脱困境。</p>
<p>复位信号要求：</p>
<p>高电平； 应持续24个振荡周期（即两个机器周期以上）。</p>
<table>
<thead>
<tr>
<th><strong>SFR名称</strong></th>
<th><strong>初始状态</strong></th>
<th><strong>SFR名称</strong></th>
<th><strong>初始状态</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>ACC</strong></td>
<td><strong>00H</strong></td>
<td><strong>TMOD</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>B</strong></td>
<td><strong>00H</strong></td>
<td><strong>TCON</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>PSW</strong></td>
<td><strong>00H</strong></td>
<td><strong>TH0</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>SP</strong></td>
<td><strong>07H</strong></td>
<td><strong>TL0</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>DPL</strong></td>
<td><strong>00H</strong></td>
<td><strong>TH1</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>DPH</strong></td>
<td><strong>00H</strong></td>
<td><strong>TL1</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>P0~P3</strong></td>
<td><strong>FFH</strong></td>
<td><strong>SBUF</strong></td>
<td><strong>不确定</strong></td>
</tr>
<tr>
<td><strong>IP</strong></td>
<td><strong>XXX00000B</strong></td>
<td><strong>SCON</strong></td>
<td><strong>00H</strong></td>
</tr>
<tr>
<td><strong>IE</strong></td>
<td><strong>0XX00000B</strong></td>
<td><strong>PCON</strong></td>
<td><strong>0XXX0000B</strong></td>
</tr>
</tbody>
</table>
<p>2、掉电保护方式</p>
<p>数据转存：数据转存是通过中断服务程序完成的，即通常所说的“掉电中断” 。</p>
<p>接通备用电源：备用电源由单片机的RST/VPD引脚接入，要求系统中具有备用电源与电源电压的自动切换电路 。 </p>
<p>3、低功耗工作方式 （由PCON中的PD和IDL控制）</p>
<p>空闲模式(待机模式) 掉电保护模式(休眠模式)</p>
<h4 id="_4">小结<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4>
<p>8051单片机由8位微处理器、128B数据存储器、4KB掩膜程序存储器、4个8位并行I/O口、1个串行口、2个16位的定时/计数器以及特殊功能器等构成。</p>
<p>4个8位并行I/O口是P0、P1、P2和P3口。P1口是唯一的单功能口，仅能作通用的数据I/O口使用，P0、P2和P3口均有第二功能。</p>
<p>8051单片机的时钟电路有内部时钟和外部时钟二种方式。晶振周期(拍节)、时钟周期(状态)、机器周期和指令周期是单片机的基本时序单位。</p>
<p>复位操作使单片机进入初始化状态。复位操作有上电自动复位和按键手动复位两种方式。复位后，程序计数器PC为0，P0～P3为0FFH，SP为07H，SBUF不定，IP、IE和PCON的有效位为0，其余特殊功能寄存器的状态均为0。</p>
<h3 id="4-mcs-51">第4章 MCS-51的指令系统<a class="headerlink" href="#4-mcs-51" title="Permanent link">&para;</a></h3>
<h4 id="_5">计算机语言<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4>
<p>（1）机器语言:是用二进制代码表示的，能被计算机直接识别和执行的一种机器指令的集合。</p>
<p>优点：灵活、能被计算机直接执行、速度快等。 </p>
<p>缺点：直观性差，很容易出错，通用性很差。</p>
<p>（2）汇编语言：是一种用助记符表示的仍然面向机器的计算机语言，又将其称为符号语言。</p>
<p>优点：用符号代替了机器指令代码，简化了编程过程，而且助记符与指令代码一一对应，基本保留了机器语言的灵活性。占用的内存空间少，运行速度快。      </p>
<p>缺点： 必须对编写的程序进行加工和翻译，才能变成能够被计算机识别和处理的二进制代码程序。仍然是面向机器的语言，使用起来还是比较繁琐费时，通用性差。</p>
<p>用汇编语言等非机器语言书写好的符号程序称汇编语言源程序。</p>
<p>（3）高级语言：与自然语言相近并为计算机所接受和执行的计算机语言称为高级语言，它是面向用户的语言。</p>
<p>优点：编程容易，不需要编程者对机器硬件有较好的了解。</p>
<p>缺点：执行速度比机器语言和汇编语言慢。</p>
<h4 id="_6">汇编语言程序语句格式<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4>
<p>1、汇编指令由操作码或伪操作码、目的操作数和源操作数构成，标准书写格式如下：</p>
<p>[标号:]   操作码/伪操作码  [操作数]  [；注释]</p>
<p>标号：又称指令地址符号。它是用户设定的符号，代表着该条指令所在的地址。标号必须以字母开头，其后跟1~8个字母或数字，并以“：”结尾。标号不能为指令系统中的指令助记符、CPU的寄存器名以及伪指令等，且同一程序内标号必须互不相同。 </p>
<p>操作码/伪操作码：是用英文缩写的指令助记符。</p>
<p>操作码：规定了指令的操作功能，它所对应的汇编语句称为指令性语句。    </p>
<p>如：MOV  50H，#10H</p>
<p>机器码：75H，50H，10H。</p>
<p>伪操作码：说明汇编程序如何完成汇编工作，它所对应的语句称为指示性语句，在汇编后没有目标代码。</p>
<p>如：ORG， END， EQU 等。 </p>
<p>操作数：指参加操作的数据或数据所在的地址。在MCS-51单片机中，操作数可以是1、2、3个，也可以没有。</p>
<p>规定：操作码/伪操作码和操作数之间必须用空格分开，操作数与操作数之间必须用逗号分开。</p>
<p>注释：增加程序的可读性，以“；”号开头。 </p>
<p>2、操作数的类型</p>
<p>立即数 #30H</p>
<p>寄存器操作数 A，R0</p>
<p>存储器操作数 20H</p>
<p>3、MCS-51系列单片机指令格式及分类</p>
<p>单字节指令、双字节指令、三字节指令</p>
<p>4、MCS-51汇编语言伪指令</p>
<p>4.1 ORG（Origin）  汇编起始地址命令</p>
<p>功能：用于规定目标程序的起始地址。</p>
<p>[标号：]  ORG   地址</p>
<p>地址项：16位绝对地址，也可以用标号或表达式表示。       </p>
<p>一个源程序中，可多次使用ORG指令以规定不同程序段的起始位置。地址应从小到大顺序排列，不允许重叠。</p>
<p>4.2 END（END of assembly）汇编终止命令            </p>
<p>功能：用于终止源程序的汇编工作。</p>
<p>格式：  [标号：]   END   [表达式]</p>
<p>注意：只有主程序模块才有“表达式” 项，且“表达式”的值等于该程序模块的入口地址。而其他程序模块就没有“表达式”项。“标号：”也是选择项。</p>
<p>一个源程序只能有一个END命令。</p>
<p>4.3 DB（Define Byte）  定义数据字节命令</p>
<p>功能：用于从指定的地址单元开始，在程序存储器中定义字节数据。    </p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>ORG  8100H
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>TAB： DB     0C0H,  0F9H,  0A4H,  0B0H
</span></code></pre></div>
<p>4.4 DW（Define Word） 定义数据字命令</p>
<p>功能：用于从指定地址开始，在程序存储器单元中定义16位的数据字。</p>
<p>存放规则：高8位在前（低地址），低8位在后（高地址）。</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>ORG  1100H
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>DATA2:  DW     3478H, 10H, -1
</span></code></pre></div>
<p>注意：DB和DW定义的数表，数的个数不得超过80个。如果数据的数目较多时，可使用多个定义命令。在 MCS-51程序设计应用中，常以DB定义数据，以DW定义地址。</p>
<p>4.5 DS（Define Storage）  定义存储区命令</p>
<p>功能：用于从指定地址开始，保留指定数目的字节单元为存储区，供程序运行使用。汇编时对这些单元不赋值。</p>
<p>格式：         [标号：]      DS      16位数表</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>ORG   8100H
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>DS    08H
</span></code></pre></div>
<p>注意：对MSC-51单片机来说，DB、DW、DS命令只能对程序存储器使用，不能对数据存储器使用。</p>
<p>4.6 EQU（Equate）  赋值命令</p>
<p>功能：用于给字符名称赋予一个特定值。赋值以后，其值在整个过程中有效。</p>
<p>格式：字符名称    EQU    赋值项</p>
<p>“赋值项”：可以是常数、地址、标号或表达式。 </p>
<p>4.7 DATA  数据地址赋值命令</p>
<p>格式：字符名称    DATA   项</p>
<p>功能：与EQU基本类似，但有以下差别。</p>
<p>EQU定义的字符名称必须先定义后使用，而DATA定义的字符名可以先使用后定义。</p>
<p>用EQU可以把一个汇编符号赋给字符名称，如上例中的R1，而DATA只能把数据赋给字符名。</p>
<p>4.8 BIT   位定义命令</p>
<p>功能：    用于给字符名称赋以位地址。</p>
<p>格式：    字符名称    BIT    位地址</p>
<p>其中“位地址”可以是绝对地址，也可以是符号地址。</p>
<h4 id="_7">寻址方式<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4>
<p>寻址：获得操作数所在的地址的方法。</p>
<p>7种寻址方式：立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、基址加变址寻址、相对寻址、位寻址。</p>
<p>1、立即寻址</p>
<p>指令中直接给出操作数的寻址方式。</p>
<p>立即数：8位或16位。</p>
<p>2、直接寻址</p>
<p>指令中直接给出操作数所在地址的寻址方式。</p>
<p>操所数所在区域：</p>
<p>（1）<mark>内部RAM的低128单元；</mark></p>
<p>（2）特殊功能寄存器。</p>
<p>3、寄存器寻址</p>
<p>以通用寄存器的内容为操作数的寻址方式。</p>
<p>例如：MOV  20H，A       ； 20H ←（ A ）</p>
<p>可用的寄存器：通用寄存器R0~R7和若干SFR，例如，A，B和DPTR。</p>
<p>其中B仅在乘除法指令中为寄存器寻址，在其他指令中为直接寻址。A既可以是直接寻址，也可以是寄存器寻址。 </p>
<p>直接寻址和寄存器寻址的差别在于直接寻址是以操作数所在的单元地址(占一个字节)出现在指令码中，而寄存器寻址是寄存器编码出现在指令码中。由于可用作寄存器寻址的寄存器少、编码位数少(少于三位二进制数)，通常操作码和寄存器编码合用一个字节，因此寄存器寻址的指令机器码短，执行快。</p>
<p>4、寄存器间接寻址</p>
<p>以寄存器中的内容为地址，以该地址中的内容为操作数的寻址方式称为寄存器间接寻址。</p>
<p>可用的寄存器：R0、R1和DPTR。</p>
<p>MOV A，＠R0   ；A←((R0))</p>
<p>寄存器间接寻址的寻址范围为片内RAM和片外RAM。</p>
<p>寄存器间接寻址的寻址范围：片内RAM和片外RAM。</p>
<p>当寻址片内RAM时，使用R0或R1作间址寄存器，其通用形式为 @Ri（i=0或1） 。</p>
<p>当寻址片外RAM时，使用DPTR作间址寄存器，其通用形式为 @DPTR。</p>
<p>5、变址寻址(或基址加变址寻址)</p>
<p>以DPTR或PC作基址寄存器，累加器A作变址寄存器，并以两者内容相加形成的16位地址作为操作数地址的寻址方式称为变址寻址，或基址加变址寻址方式。</p>
<p>寻址空间：<mark>程序存储器ROM。</mark></p>
<p>指令：MOVC</p>
<p>变址寻址方式只能对程序存储器进行寻址，或者说它是专门针对程序存储器的寻址方式。</p>
<p>变址寻址的指令只有三条</p>
<p>MOVC    A，＠A＋DPTR   MOVC    A，＠A＋PC    JMP  ＠A＋DPTR</p>
<p>其中前两条是程序存储器读指令，后一条是无条件转移指令。</p>
<p>尽管变址寻址方式操作较为复杂，但变址寻址指令都是一字节指令。 </p>
<p>6、相对寻址 </p>
<p>寻址方式主要用于通过修改PC值而实现程序的分支转移。 </p>
<p>在汇编语言中，相对转移指令后给出的地址即为程序的目标地址. </p>
<p>注意: 在机器语言中相对转移指令指令代码后跟的不是汇编语言中给出的目标地址，而是该目标地址和程序计数器PC的当前值（指跳转指令的下条指令的地址）之间的相对偏差rel。 </p>
<p>7、位寻址方式</p>
<p>在进行位操作时，借助于进位位C作为操作累加器。</p>
<p>对于特殊功能寄存器中具有位地址和位名称的位，可以采用以下四种方法表示.</p>
<p>(1) 位名称表示方法：CLR  CY</p>
<p>(2) 位地址表示法：CLR  0D7H</p>
<p>(3) 单元地址加位的表示方法：CLR  0D0H.7 </p>
<p>(4) 专用寄存器符号加位的表示方法：CLR  PSW.7</p>
<p>注：源操作数和目的操作数各有自己的寻址方式。          MOV 50H， R1</p>
<p>源操作数：寄存器寻址方式，</p>
<p>目的操作数：直接寻址方式，</p>
<p>指令的功能：把按寄存器寻址取出的R1内容再以直接寻址方式存放于内部RAM的50H单元中。</p>
<h4 id="_8">指令系统<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4>
<p>五大类：数据传送类指令、算术运算类指令、逻辑运算及移位类指令、控制转移类指令位操作类指令。</p>
<p>1、数据传送类指令</p>
<p>指令功能：一般是把源操作数传输到目的操作数，指令执行后，源操作数不变，而目的操作数修改为源操作数。 </p>
<p>对外部RAM数据传送指令作如下说明：</p>
<p>①  外部数据存储器数据传送指令就是外部RAM的读写指令。</p>
<p>②  外部RAM数据传送指令与内部RAM数据传送指令的助记符不同。</p>
<p>​   内部RAM：MOV，</p>
<p>​   外部RAM：MOVX。    增加的“X”表示外部之意。</p>
<p>③ 外部RAM传送，只能通过累加器A进行。 </p>
<p>MOX 外部RAM</p>
<p>MOV 内部RAM</p>
<p>MOVC  A，@A+PC；PC的查表范围在256B内，称近程查表。</p>
<p>MOVC  A，@A+DPTR ；DPTR可指向64KB空间，称远程查表。</p>
<p>整字节交换指令 XCH</p>
<p>半字节交换指令 XCHD</p>
<p>累加器高低半字节交换指令 SWAP</p>
<p>PUSH    direct    ；SP←（SP）+1，（SP）←（direct）</p>
<p>POP     direct    ；direct←((SP))，SP←（SP）－1</p>
<p>注意：使用堆栈前，需设定SP的初始值。</p>
<p>寻址方式： 以SP为间址寄存器的间接寻址方式。</p>
<blockquote>
<p>注：数据传送类指令一般不影响程序状态字PSW， 但堆栈指令（PUSH和POP）可以直接修改状态字PSW。</p>
</blockquote>
<p>2、算术运算类指令</p>
<p>2.1 加法指令组（ADD）</p>
<p>加法运算影响PSW位的状态。如果位3有进位，则辅助位标志AC置1，否则AC清0；如果位7有进位，则进位标志CY置1，否则CY清0。两个带符号数相加，还有溢出的问题。如果运算结果使溢出标志OV置1，则表示有溢出出现。</p>
<p>2.2 带进位加法指令组 ADDC</p>
<p>三个数参加运算：累加器A，不同寻址方式的加数，以及==进位标志位CY==，运算结果送累加器A。</p>
<p>2.3 带借位减法指令组</p>
<p>SUBB    A，Rn        ； A←（A）－（Rn）－<mark>（CY）</mark></p>
<p>若进行不带借位的减法运算，需用CLR  C 把进位标志位清0即可。</p>
<p>带借位减法指令影响PSW的状态:</p>
<p>如果位3有借位，则AC置1，否则清0；</p>
<p>如果位7有借位，则CY置1，否则CY清0；</p>
<p>另外，两个带符号数相减也有溢出的问题，如溢出，则OV置1，否则，清0。</p>
<p>2.4 加1/减1/乘除指令组</p>
<p><mark>INC   DPTR</mark></p>
<p>加1指令的操作不影响程序状态字PSW的状态, 除INC A对P外。p &harr; 奇偶校验位</p>
<p>减1指令的操作不影响程序状态字PSW的状态, 除DEC A对P外。</p>
<p>51指令系统中，只有数据指针DPTR加1指令，而没有DPTR减1指令。</p>
<p>若乘积 &lt; 0FFH（即（B）=0），则OV＝0，否则OV＝1，该运算总使CY＝0。</p>
<p>当除数为0（B＝0）时，OV＝1，表明除法无意义，无法进行；其它情况下， OV＝0。任何情况下， CY＝0。</p>
<p>乘除法运算影响PSW的状态。</p>
<p>2.5 十进制调整指令：</p>
<p>DA      A</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>MOV A, #48H
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>ADD A, #79H
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>DA  A;  A == #27H
</span></code></pre></div>
<p>一个十进制数用四位二进制编码表示，即二进制编码的==十进制数==，简称BCD码。</p>
<p>BCD码的修正（了解）</p>
<p>(1) 如果任何两个对应位BCD数相加的结果向高一位无进位时，若得到的结果小于或等于 9，则该位不需修正；若得到的结果大于 9 且小于 16 位，则该位进行加 6 修正。      </p>
<p>(2) 如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于 16)，该位进行加 6 修正。      </p>
<p>(3) 低位修正结果使高位大于 9 时， 高位进行加 6 修正。</p>
<p>3、逻辑运算及移位类指令</p>
<p>3.1 逻辑与运算指令组</p>
<p>累加器A循环左移指令  RL  A       </p>
<p>累加器A循环右移指令 RR  A </p>
<p>累加器A带进位循环左移指令 RLC  A</p>
<p>累加器A带进位循环右移指令 RRC  A   </p>
<p>3.2 跳转指令</p>
<p>间接转移指令</p>
<p>JMP    @A+DPTR      ；PC←（A）+（DPTR）</p>
<p>该指令可代替众多的判别跳转指令，具有散转功能（又称散转指令）。键盘译码程序就是本指令的一个典型应用。</p>
<p>3.3 位操作指令</p>
<p>在MCS-51中没有专门的数值比较指令，两个数的数值比较可利用这四条指令执行后CY的状态来判断数值大小。</p>
<p>若（CY）＝0，则左操作数＞右操作数</p>
<p>若（CY）＝1，则左操作数＜右操作数</p>
<blockquote>
<p>注：CJNE可配合JC和JNC使用判断正负。</p>
</blockquote>
<p>两个寻址位间不能实现直接传送。</p>
<h3 id="5-mcs-51">第5章   MCS-51的汇编语言程序设计<a class="headerlink" href="#5-mcs-51" title="Permanent link">&para;</a></h3>
<p>汇编语言程序共有四种结构形式：顺序结构、循环结构、分支结构和子程序结构。</p>
<h4 id="_9">查表指令<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4>
<div class="language-text highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>     ORG 0
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>     MOV    A，30H     
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>     MOV DPTR，#TAB      ；地址修正
</span><span id="__span-4-4"><a id="__codelineno-4-4" name="__codelineno-4-4" href="#__codelineno-4-4"></a>     MOVC A，@A+DPTR     
</span><span id="__span-4-5"><a id="__codelineno-4-5" name="__codelineno-4-5" href="#__codelineno-4-5"></a>     MOV 31H，A          ；双字节指令
</span><span id="__span-4-6"><a id="__codelineno-4-6" name="__codelineno-4-6" href="#__codelineno-4-6"></a>TAB：DB 3FH，06H，5BH，4FH，66H；字形代码表
</span><span id="__span-4-7"><a id="__codelineno-4-7" name="__codelineno-4-7" href="#__codelineno-4-7"></a>     DB 6DH，7DH，07H，7FH，6FH 
</span><span id="__span-4-8"><a id="__codelineno-4-8" name="__codelineno-4-8" href="#__codelineno-4-8"></a>     END
</span></code></pre></div>
<blockquote>
<p>注：JBC指令</p>
<p>JBC bit NEXT</p>
<p>单片机指令，检测某个位是否为1，若为1，则清零，并跳转到NEXT，若为零，则执行下一条语句。</p>
</blockquote>
<h4 id="_10">散转指令<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4>
<p>JMP  @A+DPTR</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>        MOV DPTR，#TAB
</span><span id="__span-5-2"><a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>        JMP @A+DPTR
</span><span id="__span-5-3"><a id="__codelineno-5-3" name="__codelineno-5-3" href="#__codelineno-5-3"></a>        NOP
</span><span id="__span-5-4"><a id="__codelineno-5-4" name="__codelineno-5-4" href="#__codelineno-5-4"></a>TAB：    AJMP      ADDM      ；散转表
</span><span id="__span-5-5"><a id="__codelineno-5-5" name="__codelineno-5-5" href="#__codelineno-5-5"></a>        AJMP      SUBM
</span><span id="__span-5-6"><a id="__codelineno-5-6" name="__codelineno-5-6" href="#__codelineno-5-6"></a>        AJMP      MULM
</span><span id="__span-5-7"><a id="__codelineno-5-7" name="__codelineno-5-7" href="#__codelineno-5-7"></a>        AJMP      DIVM 
</span></code></pre></div>
<p>在使用JMP  @A+DPTR构成多分支程序时的注意事项：</p>
<p>① 由于A是8位寄存器，如果分支程序的个数大于128，则地址修正值大于256。为了获得正确的地址，需对数据指针的高8位DPH进行修正。</p>
<p>② 散转点数不得超过256，这是由A的容量确定的。</p>
<p>③ AJMP指令的跳转范围为2KB，这就限制了各分支程序的入口地址和转移表首地址TAB位于同一个2KB的空间范围内。为了克服这种局限，可以采用LJMP指令。</p>
<h4 id="_11">子程序结构：<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4>
<p>指令： RET或RETI。</p>
<p>注意事项：</p>
<p>（1）子程序有自己的名字;</p>
<p>（2）保护现场和恢复现场；</p>
<p>（3）正确地传递参数；</p>
<p>（4）子程序和主程序是相对的两个概念。</p>
<h3 id="7">第7章  中断系统<a class="headerlink" href="#7" title="Permanent link">&para;</a></h3>
<h4 id="io">单片机中I/O传送方式<a class="headerlink" href="#io" title="Permanent link">&para;</a></h4>
<p>三种控制方式：</p>
<p>1）无条件传送方式 2）查询方式 3）中断方式</p>
<p>1、无条件传送方式</p>
<p>MOV P1, #30H; MOV A, P1</p>
<p>适用范围：</p>
<p>（1）具有常驻的或变化缓慢数据信号的外部设备，</p>
<p>（2）工作速度非常快，足以和CPU同步工作的外部设备。 例如：数/模转换器DAC。</p>
<p>2、程序查询方式</p>
<p>特点：输入输出完全由CPU控制；硬件电路比较简单。</p>
<p>缺点：浪费CPU的时间。</p>
<p>3、中断方式</p>
<p>中断方式与查询方式的主要区别在于：如何知道外设是否为数据的传送作好了准备。</p>
<p>查询方式是CPU的主动形式，而中断方式则是CPU等待通知（中断请求）的被动方式。</p>
<p>3.1 中断的基本概念</p>
<p>指CPU在处理某件事情的时候，外部发生了某一事件请求CPU迅速去处理，于是CPU暂时中断当前的工作，转入处理所发生的事件，中断访问处理完后，再回到原来被中断的地方，继续原来的工作的过程称为中断。</p>
<p>中断系统（中断机构）；实现中断功能的部件</p>
<p>中断源：产生中断的请求源。</p>
<p>五个中断源：2个外部中断， INT0和INT1、2个定时/计数器中断， T0和T1、1个串行中断。</p>
<p>3.2 中断优先级</p>
<p>CPU必须具备区分哪个中断源更为重要，从而确定优先处理哪个事件的能力，这就是中断优先级。
一般根据中断源的轻重缓急排队，优先处理最紧急事件的中断请求。</p>
<p>MCS-51系列单片机中，中断源有两个优先级，即低优先级和高优先级。</p>
<p>3.3 中断嵌套</p>
<p>当CPU正在处理某一中断请求时，又有优先级别更高的中断源发出中断请求，则CPU中止正在进行的中断处理程序，转去处理优先级更高的中断请求。待处理完后，再继续执行被中止了的中断处理程序，这样的过程称为中断嵌套，该中断系统称为多级中断系统。没有中断嵌套功能的中断系统称为单级中断系统。</p>
<p>3.4 中断的允许与禁止</p>
<p>当CPU正在执行主程序时，某个中断源发出中断请求，如果CPU接受该中断而转去处理中断服务程序，则称CPU允许此中断或开中断。如果有中断请求，但CPU并不接收此中断，则称CPU禁止中断、屏蔽中断或关中断。</p>
<h4 id="_12">中断系统结构及中断控制<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h4>
<p>1、中断系统结构和中断源</p>
<p><img alt="image-20220613193548672" src="https://pic.tim-wcx.ltd/2022/06/13/62a7211ae3c80.png" /></p>
<p>当IT0=0时，外部中断程序位电平触发方式，低电平有效，当IT0=1时，外部中断为脉冲触发方式，负跳变时有效。</p>
<p>中断优先级是为中断嵌套服务的，MCS—51中断优先级的控制原则是：</p>
<p>①  低优先级中断请求不能打断高优先级的中断服务；但高优先级中断请求可以打断低优先级的中断服务，从而实现中断嵌套。</p>
<p>②  如果一个中断请求已被响应，则同级的其它中断响应将被禁止。</p>
<p>③  如果同级的多个中断请求同时出现，则按CPU设定的自然优先级确定那个中断请求被响应。其自然优先级由高到低依次为：外部中断0→定时中断0→外部中断1→定时中断1→串行中断，这其实是CPU查询各中断的次序。</p>
<p>中断响应过程  </p>
<p>MCS-51单片机的CPU在每个机器周期的S5P2时刻采样中断标志。当发现有中断请求时，首先将这些中断请求锁存在各自的中断标志位中，并在下一个机器周期的S6期间查询所有中断标志，同时按照优先级由高到低排队，之后判断是否满足中断响应的条件，若满足，则在下一个机器周期S1期间按照优先级进行中断处理。</p>
<p>响应中断的条件 </p>
<p>① 该中断源发出中断请求；</p>
<p>②  CPU开中断，即中断总允许位EA=1；</p>
<p>③ 申请中断的中断源的中断允许位为1，即该中断没有被屏蔽；</p>
<p>④ 无同级或是更高级中断正在被服务。 </p>
<p>中断响应过程被阻断的条件</p>
<p>①  同级或高优先级的中断已在进行中； </p>
<p>②  当前的机器周期还不是正在执行指令的最后一个机器周期。也就是说，正在执行的指令完成前，任何中断请求都得不到响应；</p>
<p>③ 正在执行的是一条RET或RETI，或者访问特殊功能寄存器 IE或 IP的指令。执行这些指令之后，不会马上响应中断请求，至少要执行一条其它指令之后才能响应中断。 </p>
<p>响应中断后，硬件完成的功能：</p>
<p>① 根据响应的中断源的中断优先级，使相应的优先级状态触发器置1； </p>
<p>② 调用中断服务子程序, 并把当前程序计数器PC的内容压入堆栈；</p>
<p>③ 清除相应的中断请求标志位（串行口中断请求标志RI和TI除外）；</p>
<p>④ 把被响应的中断源所对应的中断服务程序的入口地址送入PC，从而执行中断服务程序。 </p>
<p>中断响应时间:  3~8个机器周期.</p>
<p>主程序的初始化：</p>
<p>初始化包括：相应中断源开中断；设定所涉及中断源的中断优先级；若为外部中断，应规定其触发方式。</p>
<p>中断服务程序的最后一条指令是RETI。</p>
<h4 id="_13">定时/计数器的结构和寄存器<a class="headerlink" href="#_13" title="Permanent link">&para;</a></h4>
<p>定时/计数器的原理结构框图</p>
<p><img alt="image-20220613203434496" src="https://pic.tim-wcx.ltd/2022/06/13/62a72ee00951c.png" /></p>
<p>1、定时/计数器的定时和计数功能</p>
<p>定时计数器的功能：定时和计数</p>
<p>1）计数功能</p>
<p>计数：对外部事件进行计数。外部事件的发生以输入脉冲表示。</p>
<p>计数输入端：T0（P3.4）和T1（P3.5），脉冲在负跳变时计数器加1（<strong>加法计数</strong>）。</p>
<p>2）定时功能</p>
<p>实现方法：通过计数器的计数实现。</p>
<p>与计数功能的不同之处：</p>
<p>计数脉冲来自单片机的内部，即每个机器周期产生一个计数脉冲，即每个机器周期计数器加1。      </p>
<p>若：单片机晶振＝6MHz，机器周期为2微秒。</p>
<p>2、定时器/计数器的初始化</p>
<p>将控制字写入定时器/计数器的过程叫定时器/计数器的初始化。</p>
<p>初始化内容：</p>
<p>规定T0、T1的工作方式；  规定T0、T1的工作状态； 赋定时/计数初值。</p>
<p>3、定时/计数器初值的确定</p>
<p>定时器/计数器以加1方式计数，假定要求的计数长度为N，则应装入定时器/计数器的初值<span class="arithmatex"><span class="MathJax_Preview">X＝2^{13}－N</span><script type="math/tex">X＝2^{13}－N</script></span>。</p>
<p>4、写入控制字的次序：</p>
<p>​   1） 把工作方式控制字写入TMOD寄存器；</p>
<p>​   2）把定时/计数初值装入TL0、TH0（或TL1、TH1）；</p>
<p>​    3）置位ET0（或ET1）允许定时器/计数器中断（如果需要）；</p>
<p>​   4）置位EA使CPU开放中断。</p>
<p>​   7）置位TR0（或TR1）以启动计数</p>
<p>5、方式0</p>
<p><img alt="image-20220613214247617" src="https://pic.tim-wcx.ltd/2022/06/13/62a73ed82f58d.png" /></p>
<p>6、方式1</p>
<p><img alt="image-20220613214227133" src="https://pic.tim-wcx.ltd/2022/06/13/62a73ec8d05ad.png" /></p>
<p>7、方式2</p>
<p><img alt="image-20220613214522208" src="https://pic.tim-wcx.ltd/2022/06/13/62a73f7722b19.png" /></p>
<p>8、方式3下，T0和T1的 工作的设置和使用是不同的。</p>
<p><img alt="image-20220613214902047" src="https://pic.tim-wcx.ltd/2022/06/13/62a740533de5c.png" /></p>
<p>T0的各控制位、引脚和中断源，即GATE、TR0、TF0、C/T和T0（P3.4）引脚、INT0（P3.2）引脚全归TL0使用。其功能和操作与方式1或0完全相同。</p>
<p>所以：在工作方式3下，T0被拆成两个独立的8位计数器TL0和TH0。其中TL0既可以作计数使用，又可以作定时使用。</p>
<p>TH0只好借用定时器/计数器1的控制位TR1和TF1，即以计数溢出去置位TF1，而定时的启动和停止则受TR1的状态控制。</p>
<p>所以：方式3下T0可以作两个8位的定时器或一个定时器和一个计数器。</p>
<p>工作方式3下的T1</p>
<p>​   如果T0已工作在工作方式3，则T1只能工作在方式0、1或方式2下，它的运行控制位TR1及计数溢出标志位TF1已被T0借用。</p>
<p><img alt="image-20220613215415707" src="https://pic.tim-wcx.ltd/2022/06/13/62a7418c4e6fc.png" /></p>
<p>此时，T1通常是作为串行口的波特率发生器使用，以确定串行通信的速率。因为已经没有计数溢出标志位TF1可供使用，因此只能把计数溢出直接送给串行口。若将T1强行设置为模式3，就会使T1立即停止工作。</p>
<p>9、门控位的应用举例</p>
<p>当门控位GATE=1时，如果TR0（TR1）=1且/INT0（/INT1）=1才能启动定时/计数器，当/INT0（/INT1）=0时又使定时/计数器停止。可利用这一特性测量外部输入脉冲的宽度。</p>
<h4 id="_14">小结<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4>
<p>在定时方式下被计对象是单片机内部的机器周期数；而在计数方式下，被计对象是外部事件的数量（由高电平到低电平的边沿数）。</p>
<p>无论是定时还是计数，当计数器溢出时会自动置位TF0或TF1。在查询方式下可以通过检查TF的状态判断是否计满；在允许中断的情况下，CPU自动进入中断服务程序。采用中断方式可大大提高CPU的利用率。</p>
<h3 id="8">第8章 存储器的扩展<a class="headerlink" href="#8" title="Permanent link">&para;</a></h3>
<h4 id="_15">存储器概述<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4>
<p>1、存储器的分类     </p>
<p>按照存取速度和用途：内存和外存 内存一般都使用半导体存储器</p>
<p>2、半导体存储器的分类</p>
<p>按存取方式不同，分为:随机读写存储器RAM(Random Access Memory)；只读存储器ROM (Read Only Memory)。</p>
<p>按制造工艺不同，分为：双极型、CMOS型和HMOS型。 </p>
<p><img alt="image-20220613224133635" src="https://pic.tim-wcx.ltd/2022/06/13/62a74ca25e7d5.png" /></p>
<p>3、随机存取存储器（RAM）</p>
<p>​       按信息存储方式可分为SRAM, DRAM.</p>
<p>​       1）静态RAM(Static RAM, 简称SRAM)：</p>
<p>​           存储单元：双稳态触发器。</p>
<p>​           优点：信息保存稳定，不易失， 缺点： 集成度低。</p>
<p>​       2）动态RAM(Dynamic RAM, 简称DRAM)：</p>
<p>​            存储单元：电容。</p>
<p>​            优点: 电路简单， 集成度高，    缺点： 电容易漏电。</p>
<p>​       3）非易失RAM：或掉电自保护RAM，即NVRAM（Non volative RAM） NVRAM=SRAM+EEPROM</p>
<p>4、只读存储器：</p>
<p>​       1） 掩膜ROM</p>
<p>​       2） 可编程ROM （PROM）</p>
<p>​       3） 可擦除的PROM （EPROM－ Erasable Programmable ROM)， 紫外线擦除 (UV EPROM)</p>
<p>​       4） 电擦除的PROM （EEPROM ：E2PROM－Electrically Erasable PROM）</p>
<p>5、存储容量</p>
<p>​       存储容量是指存储器可以存储的二进制信息量，以位为单位。</p>
<p>​       它一般是以能存储的字数乘以字长表示的。即</p>
<p>​       存储容量=单元数×数据线的位数</p>
<p>​      数据线的位数： 1, 2, 4, 8 位</p>
<p>最大存取时间：指从CPU给出有效的存储器地址到存储器给出有效数据所需的时间。 </p>
<h4 id="_16">单片机的扩展结构<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4>
<p>1、单片机的扩展结构</p>
<p>单片机扩展通常采用总线结构形式，下图是典型的单片机扩展结构。整个系统以单片机为核心，通过总线连接起扩展部件。</p>
<p><img alt="image-20220613224820876" src="https://pic.tim-wcx.ltd/2022/06/13/62a74e3b51ac5.png" /></p>
<p>总线是单片机各种功能部件之间传送信息的公共通信干线，它是由导线组成的传输线束，是一类信号线的集合。</p>
<p>按照单片机所传输的信息种类，总线可以划分为数据总线、地址总线、控制总线</p>
<p>1）数据总线DB</p>
<p>​    数据总线用于传送数据信息。数据总线是双向三态形式的总线，即它既可以把CPU的数据传送到存储器或I/O接口等其它部件，也可以将其它部件的数据传送到CPU。数据总线的位数是微型计算机的一个重要指标，通常与微处理器的字长相一致。如51单片机字长8位，其数据总线宽度也是8位。需要指出的是，数据的含义是广义的，它可以是真正的数据，也可以是指令代码或状态信息，有时甚至是一个控制信息。因此，在实际工作中，数据总线上传送的并不一定是真正意义上的数据。</p>
<p>2）地址总线AB</p>
<p>​   地址总线用于传送地址信号。地址总线总是单向三态的。地址总线的位数决定了CPU可直接寻址的内存空间大小。比如Intel的8080是8位微处理器，地址总线为16位，则其最大可寻址空间为216=64KB，Intel的8088是16位微型机，地址总线为20位，其可寻址空间为220B=1MB。一般来说，若地址总线为n位，则可寻址空间为2n个字节。</p>
<p>3）控制总线CB（control bus）</p>
<p>​      控制总线用于传送控制信号和时序信号。控制信号中，有的是微处理器送往存储器和I/O接口电路的，如读/写信号，片选信号、中断响应信号等；也有是其它部件反馈给CPU的，比如：中断申请信号、复位信号、总线请求信号、设备就绪信号等。因此，对于一个具体的控制信号，其只可能是一个方向的，但是对于一类信号，则是双向的。控制总线的位数要根据系统的实际控制需要而定。 </p>
<p>2、单片机扩展的实现</p>
<p><img alt="image-20220613230054889" src="https://pic.tim-wcx.ltd/2022/06/13/62a7512b71dcf.png" /></p>
<p>3、并行存储器的扩展</p>
<p>按功能不同存储器又可分为 随机存取存储器、只读存储器、可读写ROM</p>
<p>按照数据传送方式不同分 并行存储器、串行存储器</p>
<p>按照制造工艺的不同ROM可分为掩模ROM、可编程ROM (PROM)、光可檫除的ROM（EPROM）、电可擦除的ROM（E2PROM）、快擦写ROM（Flash ROM）</p>
<p>**EPROM**的典型芯片是Intel公司的27系列产品，按存储容量不同有多种型号，例如2716（2Kx8b）、2732（4Kx8b）、2764（8Kx8b）、27128（16Kx8b）、27256（32Kx8b）等。</p>
<p>MOVC指令访问。</p>
<p><img alt="image-20220614114844439" src="https://pic.tim-wcx.ltd/2022/06/14/62a805213fa59.png" /></p>
<p>A0~A14：地址输入线</p>
<p>D0~D7：数据线</p>
<p>CE：片选信号线</p>
<p>OE：读选通信号线</p>
<p>PGM：编程脉冲输入端</p>
<p>Vpp：编程时编程电压输入端</p>
<p>单片机的片内和片外ROM是统一编址的。当接地时，只能读外部ROM，当接高电平时，从内部ROM开始读，当地址超过0FFFH时，读外部ROM。在访问外部ROM时，控制信号有ALE和PSEN。</p>
<p>编址方法：</p>
<p>线选法：以系统的某高位地址线作为存储芯片的片选信号，为此只需把高位地址线与存储芯片的片选信号直接相连 </p>
<p>译码法：使用译码器对MCS-51单片机的高位地址线进行译码，以译码输出作为存储器芯片的片选信号 </p>
<p>采用线选法时每个存储器芯片的地址范围是唯一的，但各芯片的地址范围不连续，这将给存储程序带来很大的不便。多片存储芯片扩展中，地址范围的不连续是线选法的另一个缺点。为了使各存储器芯片的地址范围唯一且连续，可以采用译码法。 </p>
<p>4、并行数据存储器的扩展</p>
<p><img alt="image-20220614120047617" src="https://pic.tim-wcx.ltd/2022/06/14/62a807f316b44.png" /></p>
<p>A0~A14：地址输入线</p>
<p>D0~D7：数据线</p>
<p>CE：片选信号线</p>
<p>OE：读选通信号线</p>
<p>WE：写选通信号线</p>
<p>CS：选通端；</p>
<p>NC：空脚</p>
<p>5、并行程序存储器和数据存储器的混合扩展</p>
<h4 id="i2ci2cat">I2C总线及I2C总线的AT存储器扩展<a class="headerlink" href="#i2ci2cat" title="Permanent link">&para;</a></h4>
<p>TODO</p>
<h4 id="_17">小结<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4>
<p>​      存储器按照功能可分为两大类：ROM和RAM。ROM主要存放程序和常用数据，只能读取。RAM主要存放各种数据，随机存取。ROM可分为掩模ROM、PROM、EPROM、E2PROM和Flash ROM。目前，单片机系统常用的有Intel 27系列的EPROM和28系列的E2PROM。RAM可分为SRAM和DRAM，常用的有Intel的62系列芯片。</p>
<p>​      I2C总线器件和单片机连接只需要SDA和SCL两根线，因节省I/O口、电路连接简单得到了较为广泛的应用。I2C总线的AT系列存储器因其断电后数据不消失而深受欢迎，在使用上应严格按照时序进行各类信号及数据的传送。 </p>
<h3 id="9-mcs-51">第9章 MCS-51单片机串行接口<a class="headerlink" href="#9-mcs-51" title="Permanent link">&para;</a></h3>
<h4 id="_18">串行通信概述<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4>
<p>串行通信有两种基本通信方式，分别是异步通信和同步通信。</p>
<p>1、异步通信ASYNC (asynchronous data communication)</p>
<p>异步通信的数据是按一定的帧格式传送的。帧格式中，一个字符由四部分组成：起始位，数据位，奇偶校验位和停止位。首先是一个起始位（0），然后是5到8位数据位（一般规定低位在前，高位在后），接下来是奇偶校验位（可省），最后是停止位（1）。</p>
<p>2、同步通信SYNC(synchronous data communication) </p>
<p>同步通信中，在数据开始传送前用同步字符来指示（常约定为1~2个同步字符），并由同步时钟来实现发送端和接收端同步，即检测到规定的同步字符后，就连续按顺序传送数据，直到通信告一段落。同步传送时，字符与字符间没有间隙，也没有起始位和停止位，仅在数据块开始时用同步字符来指示。</p>
<p>3、串行通信的线路传输方式</p>
<p>（1）单工传输方式</p>
<p>（2）半双工传输方式</p>
<p>（3）全双工传输方式</p>
<p>4、波特率</p>
<p>串行通信中，数据传送速率有两个测量单位，即比特率和波特率。比特率（bit rate）表示每秒传送的二进制数据的位数，单位为b/s（有时候也写成bps，即bit per second）。 </p>
<p>在数据通信中常用波特率表示每秒传送的符号数，单位为波特（baud）。对于一次发送一位的装置，如PC机和MCS-51单片机的串行口，比特率和波特率是一样的，即1 baud＝1b/s。</p>
<h4 id="mcs-51">MCS-51单片机串行口<a class="headerlink" href="#mcs-51" title="Permanent link">&para;</a></h4>
<p>MCS-51系列单片机内部有一个采用异步通信工作方式的可编程全双工串行通信接口，通过软件编程，可以用作UART，也可做同步移位寄存器用。其帧格式可有8位、10位和11位几种，并能设置波特率，在使用上灵活方便。 </p>
<p>1、串行口结构及工作原理 </p>
<p>（1）串行口的结构</p>
<p>它主要由两个数据缓冲器SBUF、一个9位的输入移位寄存器和一个串行控制寄存器SCON等组成。 </p>
<p><img alt="image-20220614131525465" src="https://pic.tim-wcx.ltd/2022/06/14/62a819723e020.png" /></p>
<blockquote>
<p>注：TH1和TL1为时钟1的溢出速率</p>
</blockquote>
<p>3、串行口的工作原理</p>
<p>串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读/写的。当向SBUF写操作时（即执行MOV SBUF, A指令） ,则向发送缓冲器SBUF装载数据并由TXD引脚向外发送一帧数据 ,发送完便使发送中断标志位TI=1。 </p>
<p>在串行口允许接收（REN=1）时，就可接收一帧数据进入移位寄存器(9位)，如果满足接收中断标志位RI=0的条，则将移位寄存器中的数据装载到接收SBUF中，同时使RI=1。如果允许中断，CPU在执行中断服务程序时再接受下一帧数据；如果禁止中断，可以通过查询RI位的状态来判断是否接受完毕。当发出读SBUF命令时（MOV  A, SBUF），便将接收SBUF中的数据通过内部总线读入到累加器中或指定的内部RAM中。</p>
<h4 id="_19">串行通信工作方式<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h4>
<p>1、方式0——同步移位寄存器输入/输出方式，其串行数据通过RXD输入或输出，TXD输出移位时钟，与外围器件相连时作为外围器件的同步信号。这种方式常用于扩展I/O口。 </p>
<p><img alt="image-20220614133940561" src="https://pic.tim-wcx.ltd/2022/06/14/62a81f200b5c4.png" /></p>
<p>2、方式1 ——10位异步通信方式 ，在该方式下，TXD和RXD分别用于发送和接收数据。</p>
<p>接收数据时需要满足的条件： ① REN=1（先决条件）；② RI=0 ；③ SM2=0或接收到的停止位（第九位）为1。</p>
<p>3、方式2和方式3——这两种方式均为11位异步通信方式，由TXD和RXD发送和接收数据。两种方式的操作过程完全一样，所不同的只是波特率。每帧11位，包括1位起始位、8位数据位、1位可编程的第9位和1位停止位。</p>
<p>接收数据时需要满足的条件： ① REN=1（先决条件）；② RI=0 ；SM2=0（或接收到的第9个数据位为1）。  </p>
<h3 id="10-io">第10章 单片机并行I/O接口扩展<a class="headerlink" href="#10-io" title="Permanent link">&para;</a></h3>
<h4 id="io_1">I/O接口技术概述<a class="headerlink" href="#io_1" title="Permanent link">&para;</a></h4>
<p>1、需要I/O接口电路的原因</p>
<p>接口：  存储器接口：三总线连接简单</p>
<p>​              I/O接口：      复杂</p>
<p>2、其复杂性主要表现在以下几个方面：  </p>
<p>1）外部设备的工作速度快慢差异很大。</p>
<p>2）外部设备种类繁多，既有机械式的，又有机电式的，还有电子式的。不同种类的外部设备之间性能各异。</p>
<p>3）外部设备的数据信号是多种多样的。 既有电压信号，也有电流信号; 既有数字形式，还有模拟形式。 </p>
<p>4）外设的数据传送有近距离的，也有远距离的。  近距离： 并行传送；远距离：串行传送。传送方式的转换。</p>
<p>正是由于上述原因，使数据的I/O操作变得十分复杂，无法实现外部设备与CPU进行直接的同步数据传送，而必须在CPU和外设之间设置一个接口电路，通过接口电路对CPU与外设之间的数据传送进行协调。</p>
<p>4、在数据的I/O传送中，接口电路主要有如下几项功能;</p>
<p>​     1）速度协调</p>
<p>​     2）数据锁存</p>
<p>​    在接口电路中需设置数据锁存器，以保存输出数据直至为输出设备所接收。</p>
<p>​     3）三态缓冲</p>
<p>​    数据输入时，输入设备向CPU传送的数据也要通过数据总线，但数据总线是系统的公用数据通道，上面可能“挂”着许多数据源，工作十分繁忙。为了维护数据总线上数据传送的“秩序”，因此只允许当前时刻正在进行数据传送的数据源使用数据总线，其余数据源都必须与数据总线处于隔离状态。为此要求接口电路能为数据输入提供三态缓冲功能。</p>
<p>5、数据转换</p>
<p>CPU输入、输出信号的形式：并行，数字信号（以电压形式体现）。</p>
<p>包括：模一数转换、数－模转换、 串－并转换、并－串转换等。</p>
<p>接口电路也就成为I/O数据传送的核心内容，是计算机中不可缺少的组成部分。</p>
<p>6、接口与端口</p>
<p>接口：特指计算机与外设之间在数据传送方面的联系。</p>
<p>其功能主要是通过电路实现的，因此称之为接口电路。</p>
<p>在接口电路中应该包含：</p>
<p>数据寄存器：保存输入输出数据</p>
<p>状态寄存器：保存外设的状态信息</p>
<p>命令寄存器：保存来自CPU的有关数据传送的控制命令。</p>
<p>这些寄存器都是可读写的编址寄存器，对它们像存储单元一样进行编址。</p>
<p>把接口电路中这些已编址并能进行读或写操作的寄存器称之为端口（port），或简称口。</p>
<p>7、单片机与外设的I/O接口基本结构</p>
<p><img alt="image-20220614145540120" src="https://pic.tim-wcx.ltd/2022/06/14/62a830f0a4768.png" /></p>
<p>8、I/O操作方式</p>
<p>（1） 编址</p>
<p>I/O操作对象：存储器单元，I/O端口</p>
<p>凡需要进行读写操作的设备都存在地址。</p>
<p>编址：给单元安排地址</p>
<p>对端口编址是为I/O操作而进行的，因此也称为I/O编址。计算机中常用的I/O编址有两种方式：独立编址方式和统一编址方式。</p>
<p>独立编址：把I/O和存储器分开进行编址，即各编各的地址。在使用独立编址方式的计算机指令系统中，除存储器读写指令之外，还有专门的I/O指令以进行数据的输入和输出操作。此外在硬件方面还需要定义一些专用的信号如Z80，8088/8086的CPU也采用独立编址方式。 </p>
<p>统一编址：统一编址就是把系统中的I/O口和存储器统一进行编址。在这种编址方式中，把I/O接口中的寄存器（端口）当做存储器单元对待。对于51系列单片机，采用统一编址方式。对I/O口的操作，并不需要单独的指令，用MOVX指令即可。</p>
<p>（2）I/O口的操作</p>
<p>在单片机中把I/O接口中的寄存器与外部RAM中的存储单元同等对待。</p>
<p>对I/O端口的操作采用与外部RAM操作相同的指令用MOVX，即：     </p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a>MOVX  @DPTR,  A ；I/O口输出指令
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a>MOVX  @Ri,  A 
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a>MOVX  A, @DPTR  ；I/O口输入指令
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a>MOVX  A, @Ri 
</span></code></pre></div>
<h4 id="io_2">简单I/O接口的扩展方法<a class="headerlink" href="#io_2" title="Permanent link">&para;</a></h4>
<p>MCS-51系列单片机并行I/O接口的扩展方法灵活多样，但大致可以分为采用不可编程芯片和采用可编程并行接口芯片进行扩展两类。</p>
<p>不可编程的芯片：有74LS244、74LS245、74LS273、74LS373、74LS367、74LS377、CD4014、CD4094等；</p>
<p>可编程并行接口芯片：有8155、8255A等。 </p>
<p>简单I/O接口的扩展包括输入扩展和输出扩展两个部分。</p>
<p>1．简单输入接口扩展</p>
<p>简单输入扩展只解决数据输入的缓冲问题。</p>
<p>数据总线要求数据源必须具有三态缓冲功能，因此简单输入扩展实际上就是扩展数据缓冲器。</p>
<p>其作用是当输入设备被选通时，使数据源能与数据总线直接沟通;而当输入设备处于非选通状态时，把数据源与数据总线隔离，即缓冲器输出为高阻抗状态。</p>
<p>2、三态缓冲电路</p>
<p>三态缓冲电路就是具有三态输出的门电路，因此也称为三态门。</p>
<p><img alt="image-20220614150100159" src="https://pic.tim-wcx.ltd/2022/06/14/62a83230451e6.png" /></p>
<p>典型芯片:74LS244和74LS245</p>
<p><img alt="image-20220614150337071" src="https://pic.tim-wcx.ltd/2022/06/14/62a832ce36a56.png" /></p>
<p><img alt="image-20220614150412781" src="https://pic.tim-wcx.ltd/2022/06/14/62a832ed14c78.png" /></p>
<table>
<thead>
<tr>
<th>74LS245逻辑功能表（DIR＝1）</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>输入</strong></td>
<td><strong>输出</strong></td>
<td></td>
</tr>
<tr>
<td><strong>OE</strong></td>
<td><strong>A</strong></td>
<td><strong>B</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>1</strong></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td><strong>X</strong></td>
<td><strong>高阻</strong></td>
</tr>
</tbody>
</table>
<p>且DIR=“0”时，信号由B向A传输； 当DIR=“1”时，信号由A向B传输；</p>
<p>2、简单输出接口扩展 </p>
<p>输出解决的问题：锁存。</p>
<p>常用三态锁存器：74LS273、74LS373和74LS377。 </p>
<p><img alt="image-20220614150828412" src="https://pic.tim-wcx.ltd/2022/06/14/62a833efe48d5.png" /></p>
<p><img alt="image-20220614150851585" src="https://pic.tim-wcx.ltd/2022/06/14/62a834052a62d.png" /></p>
<table>
<thead>
<tr>
<th>74LS373的逻辑功能表</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>输入</strong></td>
<td><strong>输出</strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>OE</strong></td>
<td><strong>G</strong></td>
<td><strong>D</strong></td>
<td><strong>Q</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>1</strong></td>
<td><strong>1</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>×</strong></td>
<td><strong>不变</strong></td>
</tr>
<tr>
<td><strong>1</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>高阻</strong></td>
</tr>
</tbody>
</table>
<h4 id="intel-8155">可编程并行接口芯片Intel 8155<a class="headerlink" href="#intel-8155" title="Permanent link">&para;</a></h4>
<p>8155内有：两个8位并行I/O端口、一个6位并行I/O端口、256B的静态RAM、一个14位的减法定时/计数器。</p>
<p>1、8155的结构和引脚</p>
<p><img alt="image-20220614151529733" src="https://pic.tim-wcx.ltd/2022/06/14/62a83596ab84a.png" /></p>
<p><img alt="image-20220614155210518" src="https://pic.tim-wcx.ltd/2022/06/14/62a83e4730c1f.png" /></p>
<p>CS：片选线，低电平有效。</p>
<p>IO/M：RAM或I/O口的选择线。</p>
<p>当CS=0，IO/M=0时，8155只能做片外RAM使用，共256B。其寻址范围由以及AD0～AD7的接法决定，这和第8章讲到的片外RAM的扩展方法相同。同时，对8155内RAM的操作也使用片外RAM的读/写指令“MOVX”。当对系统同时扩展片外RAM芯片和8155的RAM时，要注意二者的编址问题。</p>
<p>TIMER IN、TIMER OUT：定时/计数器的脉冲输入、输出线。TIMER IN是脉冲输入线，其输入每一个脉冲对8155内部的14位定时/计数器减1；TIMER OUT为输出线，当计数器计满回0时，8155从该线输出脉冲或方波，波形形状由计数器的工作方式决定。 </p>
<p>2、I/O口及其工作方式</p>
<p>1）寄存器地址分配</p>
<p>当CS=0，IO/M=1 时，对3个I/O端口以及命令/状态寄存器和定时/计数器进行操作。  内部寄存器共有6个。</p>
<table>
<thead>
<tr>
<th>8155的口地址分配</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>AD7～AD0</strong></td>
<td><strong>选中的寄存器</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>AD7</strong></td>
<td><strong>AD6</strong></td>
<td><strong>AD5</strong></td>
<td><strong>AD4</strong></td>
<td><strong>AD3</strong></td>
<td><strong>AD2</strong></td>
<td><strong>AD1</strong></td>
<td><strong>AD0</strong></td>
<td></td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td>命令/状态寄存器</td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td>A口</td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>0</strong></td>
<td>B口</td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>1</strong></td>
<td>C口</td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>1</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td>定时\计数器低8位寄存器</td>
</tr>
<tr>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>×</strong></td>
<td><strong>1</strong></td>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td>定时\计数高8位寄存器</td>
</tr>
</tbody>
</table>
<p>2）命令/状态字</p>
<p><img alt="image-20220614155605957" src="https://pic.tim-wcx.ltd/2022/06/14/62a83f1aae51a.png" /></p>
<p>② 状态字</p>
<p>状态字也是8位，但实际上只使用了7位。状态字用于寄存各端口及定时/计数器的工作状态。 </p>
<p><img alt="image-20220614155622237" src="https://pic.tim-wcx.ltd/2022/06/14/62a83f2668fc9.png" /></p>
<p>3、I/O口的工作方式</p>
<p>A口和B口：通用输入/输出口，主要用于数据的I/O传送，它们都是数据口，因此只有输入和输出两种工作方式。</p>
<p>C口：6位口，它既可以用于数据的输入/输出，也可以作为控制口，用于传送对A口和B口I/O操作时的控制信号或状态信号。</p>
<p>C口有四种工作方式，分别是：</p>
<p>方式0：输入方式；</p>
<p>方式1：输出方式；</p>
<p>方式2：A口控制端口方式；</p>
<p>方式3：A口和B口控制端口方式。</p>
<p>当A口和B口以中断方式进行数据传送时，所需的联络信号由C口提供。INTR：中断请求信号（输出），高电平有效。BF：缓冲器满状态信号（输出），高电平有效。STB：选通信号（输入），低电平有效。  </p>
<table>
<thead>
<tr>
<th>**C**口线不同工作方式的功能</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td>**方式**1</td>
<td>**方式**2</td>
<td>**方式**3</td>
<td>方式4</td>
</tr>
<tr>
<td><strong>PC0</strong>  <strong>PC1</strong>  <strong>PC2</strong>  <strong>PC3</strong>  <strong>PC4</strong>  <strong>PC5</strong></td>
<td><strong>全部为</strong>  <strong>输入</strong></td>
<td><strong>全部为</strong>  <strong>输出</strong></td>
<td><strong>AINTR</strong>  <strong>ABF</strong>   <strong>ASTB</strong>   <strong>输出</strong>  <strong>输出</strong>  <strong>输出</strong></td>
<td><strong>AINTR</strong>  <strong>ABF</strong>  <strong>ASTB</strong>  <strong>BINTR</strong>  <strong>BBF</strong>  <strong>BSTB</strong></td>
</tr>
</tbody>
</table>
<p>4、8155的定时/计数器</p>
<p>1）定时/计数器的寄存器格式：14位的减法计数器。</p>
<p><img alt="image-20220614155855039" src="https://pic.tim-wcx.ltd/2022/06/14/62a83fc40cebf.png" /></p>
<p>在TIMER IN端输入计数脉冲，计满时由TIMER OUT输出脉冲或方波，输出方式由定时/计数器高8位寄存器中的M2和M1决定。</p>
<p>当TIMER IN外接脉冲时为计数方式，外接系统时钟时为定时方式。 </p>
<p><img alt="image-20220614155915286" src="https://pic.tim-wcx.ltd/2022/06/14/62a83fd355d4f.png" /></p>
<p>2）8155定时/计数器与MCS-51单片机定时/计数器的差异</p>
<p>① 8155的定时/计数器是减法计数，而MCS-51单片机的定时/计数器是加法计数，因此，二者确定初始值的方法不同。</p>
<p>② 8155的定时/计数器只有一种工作方式，即14位的计数器，而MCS-51的单片机有多种工作方式。</p>
<p>③ 8155和MCS-51的定时/计数器都有定时和计数两种功能，但对于8155的定时/计数器，不管是定时，还是计数，其计数脉冲都由外部提供，即由TIMER IN输入。</p>
<p>④ 当MCS-51的定时/计数器计满时置位溢出标志位TF，而8155的定时/计数器在计满后由TIMER OUT 输出不同形式的波形。 </p>
<p>3）定时/计数器的初始化</p>
<p>① 设置定时/计数器初始值</p>
<p>定时/计数器的14位初始值（0~214-1）由CPU分别写入8155定时/计数器的低8位和高8位寄存器。</p>
<p>② 设置输出方式</p>
<p>输出方式的设置如前面表中。</p>
<p>③ 设置工作状态</p>
<p>定时/计数器的工作状态由8155命令字的最高两位——TM2和TM1位决定。</p>
<p>当TM2、TM1 =00时：空操作，无任何动作，不影响计数器的工作。</p>
<p>​                       =01时：停止计数。</p>
<p>​                       =10时：如果计数器未启动，则空操作；若计数器正在工作，则计数器继续工作至减到0时停止；</p>
<p>​                       =11时：启动计数器。</p>
<p>8155使用时，通常是先送计数长度和输出方式的两个字节，然后再送命令字到命令寄存器控制计数器的启停。</p>
<p>5、MCS-51单片机与8155的连接</p>
<p><img alt="image-20220614160215849" src="https://pic.tim-wcx.ltd/2022/06/14/62a8408bc4b68.png" /></p>
<blockquote>
<p>注：因为8155是减数计数器，所以100分频时，应减数的初值为100，每计数达到100时输出一个电平恒定的信号，在下一个100计满时，输出电平取反，则输出是一个连续的方波，故M2M1=01。</p>
</blockquote>
<h4 id="ledlcd">LED和LCD显示接口技术<a class="headerlink" href="#ledlcd" title="Permanent link">&para;</a></h4>
<p>单片机系统中常用的显示器有： 发光二极管LED (Light Emitting Diode)显示器、液晶LCD (Liquid Crystal Display)显示器、CRT显示器等。 LED、LCD显示器有两种显示结构： 段显示: 7段 (“8”字形)、“米”字型等; 点阵显示（5×8、8×8点阵等）。</p>
<p>1、LED显示接口</p>
<p>LED显示器有共阴极和共阳极两种。</p>
<p>共阴极就是把发光二极管的阴极连在一起构成公共阴极，使用时公共阴极接地，某端接高电平时才发亮。</p>
<p>共阳极则是把发光二极管的阳极连在一起构成公共阳极，使用时公共阳极接十5V端。某端接低电平时才发亮。 </p>
<p>1）静态显示方式</p>
<p>静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后，显示字形可一直保持，直到送入新字形码为止。</p>
<p>2）动态显示方式</p>
<p>动态显示是一位一位地轮流点亮各位数码管，这种逐位点亮显示器的方式称为位扫描。</p>
<p>2、LCD显示接口技术</p>
<p>液晶是一种既具有液体的流动性又具有光学特件的有机化合物。它的透明度和呈现的颜色受外加电场的影响，利用这一特点便可作成字符显示器。</p>
<p>1） LCD显示器结构与显示原理</p>
<p>LCD的特点：</p>
<p>同LED显示器相比，液晶显示器（LCD）具有显示功耗低、体积小、重量轻、超薄等许多优点。</p>
<p>各种型号的液晶通常是按照显示字符的行或液晶点阵的行、列数来命名的。例如：</p>
<p>1602：每行显示16字符，共2行。</p>
<p>类似的有： 0801、0802、1601等。</p>
<p>应用场合：只能显示ASCII码字符，如数字、大小写字母、各种符号等。</p>
<p>图形型液晶：点阵比较多。</p>
<p>12232： 122行，32列，共122×32个点</p>
<p>12864、19264、192128、320240等。</p>
<p>段型显示器的驱动方式：静态显示驱动和动态显示驱动两种。</p>
<p>静态驱动是段型LCD最常用的驱动方法。为了驱动LCD，需要有驱动电路。驱动电路的功能是将计算机输出的二进制数或BCD码转换成驱动LCD的七段字形代码。</p>
<p>TODO</p>
<h4 id="_20">键盘接口<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h4>
<p>键盘分编码键盘和非编码键盘。</p>
<p>编码键盘：由专用的硬件译码器识别。</p>
<p>非编码键盘：靠软件识别。</p>
<p>键盘可分为独立式和行列式（矩阵式）两类。每一类按其译码方法又都分为编码键盘和非编码键盘。 </p>
<p>1、独立式非编码键盘接口及处理程序 </p>
<p><img alt="image-20220614161845563" src="https://pic.tim-wcx.ltd/2022/06/14/62a84469af4ff.png" /></p>
<p>2、行列式键盘接口及工作原理 </p>
<p><img alt="image-20220614161908729" src="https://pic.tim-wcx.ltd/2022/06/14/62a8448070bbe.png" /></p>
<p>常用的键识别方法有两种：常用的逐行（或逐列）扫描法，速度较快的线反转法。    </p>
<p>现以4行×8列键盘为例说明行（列）扫描法识别键的全过程。</p>
<p>（1） 测试是否有键按下： </p>
<p>列线拉低，读取行线是否全1</p>
<p>（2） 消抖动： 即延时10ms </p>
<p>（3） 扫描键盘以确定被按键的物理位置 </p>
<p><img alt="image-20220614162041402" src="https://pic.tim-wcx.ltd/2022/06/14/62a844dedf342.png" /></p>
<p>（4） 计算键码</p>
<p>各行的首键号依次是00H、08H、10H、18H，列线按0～7的顺序编号。键码的计算公式为： 键码= 首键号 十 列号</p>
<p>（5） 等待和判定键释放</p>
<p>再判断按键，再延时10ms。</p>
<h4 id="_21">小结<a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4>
<p>1、单片机与外设的I/O接口电路中一般包含:数据端口、状态端口和控制端口，分别用于在CPU与外设间传送不同的信息。</p>
<p>2、计算机中常用的I/O编址方式有两种，分别是统一编址方式和独立编址方式，MCS-51单片机采用的是统一编址方式。   </p>
<p>3、简单输入输出接口扩展中：</p>
<p>74LS244或74LS245等扩展输入端口，</p>
<p>74LS273、74LS373和74LS377扩展输出接口。</p>
<p>4、 8155A芯片内部包含3个并行端口，分别是端口A、B和C。A和B口是8位，C口是6位。</p>
<p>8155的A和B口有2种工作方，C口有4种方式。</p>
<p>在使用8255A前必须对其进行初始化编程，即初始化命令字。 </p>
<p>5、显示器：LED和LCD</p>
<p>LED显示器中两种接法：</p>
<p>显示方法：静态和动态两种</p>
<p>根据显示形式的不同，LCD有段型、点阵字符型和点阵图形型。 </p>
<p>6、 对口的汇编语言操作指令：</p>
<p>读： MOVX  A，@DPTR，此时/RD有效；</p>
<p>写：MOVX  @DPTR，A， 此时/WR有效；</p>
<p>7、键盘：编码键盘和非编码键盘。单片机中常用行列式非编码键盘。</p>
<p>在识别键时必须消除抖动，键数较少时，可用硬件方法消除键抖动。如果键数较多，用软件延时方法去抖动。</p>
<p>逐行（或逐列）扫描查询法或线反转法是识别键的常用方法。</p>
<h3 id="11-adda">第11章  A/D与D/A转换器及接口技术<a class="headerlink" href="#11-adda" title="Permanent link">&para;</a></h3>
<h4 id="da">D/A转换器及接口技术<a class="headerlink" href="#da" title="Permanent link">&para;</a></h4>
<p>D/A转换器是把数字量转换成模拟量的线性电路器件。由于实现D/A转换的原理、电路结构、转换精度、转换速度及工艺技术有所不同，因而出现了各种各样的D/A转换器。D/A转换器为微机系统所处理的数字信号与外部环境的模拟信号提供了一种接口，因而广泛地应用在数据采集与模拟输入/输出系统中。</p>
<p>1、D/A转换器的主要参数</p>
<p>1）分辨率</p>
<p>分辨率用输入二进制数码的位数给出。另外也可以用D/A转换器能够分辨出来的最小输出电压与最大输出电压之比给出。例如，在分辨率为10位的D/A转换器中，其分辨率也可以表示为 。若n位D/A转换器转换后的电压满量程为5V，则它能分辨的最小电压为<span class="arithmatex"><span class="MathJax_Preview">\frac{5}{2^n}</span><script type="math/tex">\frac{5}{2^n}</script></span>V。例如，8位D/A转换器的最小分辨电压为19.53mV，而10位D/A转换器的最小分辨电压为4.88mV。</p>
<p>2）转换误差</p>
<p>指D/A转换器实际输出的模拟量与理论输出模拟量之间的差值。</p>
<p>转换误差的来源很多，如转换器中各元件参数值的误差、基准电源的不稳定、运算放大器的零漂等都是误差的来源。D/A转换器的绝对误差（或绝对精度）是指加入最大数字量（全1）时D/A转换器的理论值与实际值之差，该误差值应小于LSB/2。</p>
<p>3）建立时间</p>
<p>​      指从输入的数字量发生突变开始，直到输出电压进入与稳态值相差± &frac12; LSB范围以内的这段时间称为建立时间，也可称之为转换时间。</p>
<p>​     不同类型D/A转换器的建立时间是不同的。电流型D/A转换器转换较快，一般在几微秒至几百微秒之间；电压型转换器的速度较慢，主要取决于运算放大器的响应时间。</p>
<p>​      由于计算机的运行速度高于D/A转换时间，因此无论是什么类型的D/A转换器，都必须在接口中安置锁存器，锁存短暂的输出信号，为D/A转换器提供足够时间的、稳定的数字信号。</p>
<p>2、D/A转换器的输入/输出特性</p>
<p>反映D/A转换器的输入/输出特性的方面有以下几个方面。</p>
<p>① 输入缓冲能力</p>
<p>​    D/A转换器是否带有三态缓冲器来保存输入数字量，这对D/A转换器与微机接口的设计是很重要的。</p>
<p>② 输入数据的宽度</p>
<p>​    D/A转换器通常有8位、10位、12位、14位和16位之分。当D/A转换器的位数高于计算机系统总线的宽度时，需要2次分别输入数字量。</p>
<p>③ 电流型还是电压型</p>
<p>​    即D/A转换器输出的是电压还是电流。对电流输出型，在几毫安到几十毫安；对电压输出型，电压一般在5～10V之间，有些高电压型可达24～30V。</p>
<p>④ 输入码制</p>
<p>​    即D/A转换器能接受哪些码制的数字量输入。一般对单极性输出的D/A转换器只能接受二进制码或BCD码；对双极性输出的D/A转换器，只能接受偏移二进制码或补码。</p>
<p>⑤ 单极性还是双极性输出</p>
<p>​      指输出电压是一种极性（正或负极性）还是正、负两种极性。对一些需要正负电压控制的设备，应该使用双极性D/A转换器，或在输出电路中采取相应措施，使输出电压有极性变化。</p>
<h4 id="dadac0832">并行D/A转换器DAC0832简介<a class="headerlink" href="#dadac0832" title="Permanent link">&para;</a></h4>
<p>1、DAC0832的内部结构及引脚特性</p>
<p>DAC0832是美国国家半导体公司（NSC）的产品，是一种具有两个输入数据寄存器的8位电流输出型D/A转换器，电流建立时间为1μs。采用单一电源供电（+5V～+15V），能直接与MCS-51单片机相接，不需要附加任何其它I/O接口芯片。同DAC0832功能相同的有DAC0830、DAC0831等，属于DAC0830系列，都是8位D/A转换器，可以相互代换。</p>
<p><img alt="image-20220614193634718" src="https://pic.tim-wcx.ltd/2022/06/14/62a872c68d5be.png" /></p>
<p>DAC0832由三大部分组成，分别是1个8位输入寄存器、1个8位DAC寄存器和1个8位D/A转换器。在D/A转换器中采用T型R-2R电阻网络实现数字量到模拟量的转换。采用8位输入寄存器和8位DAC寄存器两次缓冲方式，可以实现在D/A输出的同时，送入下一个数据，以便提高转换速度。</p>
<p>当各寄存器的LE＝1时，寄存器的输出跟随输入变化；当 LE ＝0时，数据锁存在寄存器中，而不随输入数据变化。对于输入寄存器，LE1=ILE·CS·WR1，因此，当ILE=1，CS=WR1=0 时，LE1=1 ，输入寄存器的输出跟随输入；对于DAC寄存器，LE2=WR2· XFER，因此当XFER=WR2=0时，DAC寄存器的输出跟随输入。</p>
<p>DAC0832的双列直插封装式引脚排列所示，各引脚的含义如下：</p>
<p>CS：片选信号，低电平有效。WR1：输入寄存器的写选通输入端，负脉冲有效（脉冲宽度应大于500ns）。当CS＝0，ILE＝1，WR1有效时，D0～D7的状态被传送到输入寄存器。</p>
<p>AGND、DGND：模拟地和数字地，是两种不同性质的地。模拟地为模拟信号与基准电源参考地，数字地为工作电源地与数字逻辑地。两地最好在基准电源处连在一起，以提高抗干扰能力。</p>
<p>D0～D7：数据输入端，TTL电平，有效时间大于90ns。 </p>
<p>ILE：数据输入锁存允许信号，高电平有效。 </p>
<p><span class="arithmatex"><span class="MathJax_Preview">V_{REF}</span><script type="math/tex">V_{REF}</script></span>：基准电压输入，电压范围-10～+10V。</p>
<p><span class="arithmatex"><span class="MathJax_Preview">R_{fb}</span><script type="math/tex">R_{fb}</script></span>：反馈电阻端。在芯片内部，此端与IOUT1接有一个15kΩ的电阻。由于DAC0832是电流输出型，而经常需要的是电压信号，因此，在输出端通过运算放大器和反馈电阻将输出电流转换为电压。注意，经常用内部的Rfb将输出电流转换为电压。</p>
<p>IOUT1：电流输出1端，<span class="arithmatex"><span class="MathJax_Preview">I_{out1}=\frac{V_{REF}}{15KΩ}*\frac{D}{256}</span><script type="math/tex">I_{out1}=\frac{V_{REF}}{15KΩ}*\frac{D}{256}</script></span></p>
<p>当DAC寄存器中的内容为全1时，IOUT1为最大值；当为全0时，IOUT1为0。</p>
<p>IOUT2：电流输出2端，<span class="arithmatex"><span class="MathJax_Preview">I_{out2}=\frac{V_{REF}}{15KΩ}*\frac{255-D}{256}</span><script type="math/tex">I_{out2}=\frac{V_{REF}}{15KΩ}*\frac{255-D}{256}</script></span></p>
<p>IOUT1+IOUT2＝常数，该常数约为330µA。在单极性输出时，IOUT2通常接地。</p>
<p>XFER：数据传送控制信号输入端，低电平有效。XFER与WR2一起控制DAC寄存器开通，构成第二级锁存。</p>
<p>WR2：DAC寄存器写选通输入端，负脉冲有效（脉冲宽度应大于500ns）。当 XFER＝0且WR2有效时，输入寄存器的数据被传到DAC寄存器中。</p>
<p>VCC：电源电压端，电压范围+5V～+15V。</p>
<p>2、D/A转换器的输出电路</p>
<p>D/A转换器输出分为单极性和双极性两种形式。其输出方式只与模拟量输出端的连接方法有关，而与其位数无关。</p>
<p>① 单极性输出</p>
<p>典型的单极性输出电路如图11-3所示，此时IOUT2接地，IOUT1接到运算放大器的反相输入端。此时，输出模拟量的电压VOUT与被转换的数字量D的关系为<span class="arithmatex"><span class="MathJax_Preview">V_{out}=-\frac{D}{256}*V_{ref}</span><script type="math/tex">V_{out}=-\frac{D}{256}*V_{ref}</script></span></p>
<p>②双极性输出</p>
<p>一般需要两级运算放大器才能将实现双极性输出。典型的双极性输出电路如图11-4所示。</p>
<p><span class="arithmatex"><span class="MathJax_Preview">V_{out2}=-(\frac{R_3}{R_2}*V_{out1}+\frac{R_3}{R_1}*V_{ref})</span><script type="math/tex">V_{out2}=-(\frac{R_3}{R_2}*V_{out1}+\frac{R_3}{R_1}*V_{ref})</script></span></p>
<p>当R1=R2=R3=2R时，VOUT2＝－(2*VOUT1+VREF)</p>
<p>又因为，<span class="arithmatex"><span class="MathJax_Preview">V_{out1}=-(\frac{D}{256}*V_{REF})</span><script type="math/tex">V_{out1}=-(\frac{D}{256}*V_{REF})</script></span></p>
<p>所以，输出模拟量VOUT2与被转换的数字量D的关系为：<span class="arithmatex"><span class="MathJax_Preview">V_{out2}=\frac{D-128}{128}*V_{REF}</span><script type="math/tex">V_{out2}=\frac{D-128}{128}*V_{REF}</script></span></p>
<p>当D＝0，80H和0FFH时，VOUT2的值分别为-VREF，0和127VREF/128。</p>
<p><img alt="image-20220614195715747" src="https://pic.tim-wcx.ltd/2022/06/14/62a877a33117f.png" /></p>
<h4 id="dac0832">DAC0832与单片机的接口及编程<a class="headerlink" href="#dac0832" title="Permanent link">&para;</a></h4>
<p>根据对DAC0832的输入寄存器和DAC寄存器的不同控制方法，DAC0832有3种工作方式：直通型、单缓冲型和双缓冲型。</p>
<p>直通型：当DAC0832芯片的CS、WR1、WR2和XFER全部接地，而ILE接+5V时，DAC0832芯片处于直通型工作方式。数字量一旦输入，就直接进入D/A转换器开始转换。此时若让芯片连续转换的话，只需连续改变数字输入端的数字信号即可。</p>
<p>单缓冲型：如果只让输入寄存器或DAC寄存器中的其中之一直通（即各自的信号电平满足要求），另一个处于受控的锁存方式，或者两个寄存器同时选通及锁存，这种工作方式称为单缓冲型。</p>
<p>双缓冲型：如果输入寄存器和DAC寄存器的锁存信号都是受控的，而且两个寄存器的锁存信号不同时有效，则称为双缓冲型。双缓冲型主要用于同时输出多路模拟信号的场合。 </p>
<p>​       根据CS、XFER和ILE是否连接于单片机的地址线，对DAC0832的编程方法有两种，分别是基于时序的方法和基于地址的方法。下面分别说明这两种方法的具体接口和编程方法。</p>
<p>（1）基于时序的编程方法</p>
<p>​       DAC0832的操作时序如图11-6所示。当CS、WR、XFER和ILE没有连接至单片机的地址线，或者未连接至经地址线译码后的输出线时，此时就不知道DAC0832的地址，因此可以根据DAC0832的操作时序对DAC0832进行编程。 </p>
<p>连线图：</p>
<p><img alt="image-20220614200913331" src="https://pic.tim-wcx.ltd/2022/06/14/62a87a6d6d8eb.png" /></p>
<p>（2）基于地址的编程方法</p>
<p>​      如果DAC0832芯片的CS、XFER和ILE中的部分引脚直接或间接（指经译码器输出引脚）连接到单片机的高位地址线，由于高位地址线与地址有关，这就决定了该芯片有一定的地址。前述，对这些地址的操作同对外部RAM单元的操作是相同的。此时，将单片机的 WR和DAC0832的相应WR相连。 </p>
<h4 id="12dadac1210">12位并行D/A转换器DAC1210<a class="headerlink" href="#12dadac1210" title="Permanent link">&para;</a></h4>
<p>DAC1208系列D/A转换器有DAC1208、DAC1209和DAC1210三种类型，它们都是与微处理器直接兼容的12位D/A转换器。其基本结构与DAC0830系列相似，也是由两级缓冲寄存器组成，因此可不添加任何接口逻辑而直接与CPU相连，且同DAC0832一样有直通型、单缓冲型和双缓冲型三种接法。DAC1208系列之间的差异主要是线性误差不同。     </p>
<p>1、DAC1210的主要性能及特点</p>
<p>DAC1210是24引脚的集成电路芯片。输入数字为12位二进制数字，分辨率12位，电流建立时间1µs，供电电源+5～+15V（单电源供电），基准电压VREF范围-10～+10V。</p>
<p><img alt="image-20220614203908798" src="https://pic.tim-wcx.ltd/2022/06/14/62a881727b597.png" /></p>
<p>DAC1210的内部结构如图11-13所示。由图11-13可见，其逻辑结构与DAC0832类似，所不同的是DAC1210具有12位数据输入端，一个8位输入寄存器和一个4位输入寄存器组成12位的数据输入寄存器。两个输入寄存器的输入允许控制都要求CS和WR为低电平，8位输入寄存器的数据输入还同时要求BYTE1/BYTE2为高电平。</p>
<p>DAC1210的部分引脚说明</p>
<p>WR1——写入1（低电平有效）， 用于将数字数据位（D1）送到输入锁存器。当 为高电平时，输入锁存器中的数据被锁存。12位输入锁存器分成2个锁存器，一个存放高8位的数据，而另一个存放低4位。 控制脚为高电平时选择二个锁存器，处于低电平时则改写4位输入锁存器。</p>
<p>BYTE1/BYTE2——字节顺序控制。当此控制端为高电平时，输入锁存器中的12个单元都被使能。当为低电平时，只使能输入锁存器中的最低4位。</p>
<p>XFER——传送控制信号（低电平有效）。该信号与 结合时，能将输入锁存器中的12位数据转移到DAC寄存器中。</p>
<p>2、DAC1210的输入与输出</p>
<p>为了用8位数据线（D0～D7）传送12位被转换数据（DI0～DI11），CPU须分两次传送被转换数据。第一步先使BYTE1/BYTE2为高电平，将被转换的高8位（DI4～DI11）传送给高8位输入寄存器；第二步使BYTE1/BYTE2为低电平，将低4位（DI0～DI3）传送给低4位输入寄存器；在此两步中，还要求CS和WR1为低电平。为避免两次输出指令之间在D/A转换器的输出端出现不需要的扰动模拟量输出，就必须使低8位和高4位数据同时送入DAC1210的12位输入寄存器。因此，第三步使WR2和XFER有效，将12位输入寄存器的状态同时传给12位DAC寄存器，并启动D/A转换。</p>
<p>在输出上，DAC 1210同DAC0832一样，是电流输出型D/A转换器，即IOUT2＋IOUT2＝常数。通常使IOUT2接地。其单极性输出和双极型输出时的电路接法与DAC0832相同。 </p>
<p>3、DAC1210 D/A转换器与MCS-51单片机的接口举例</p>
<p><img alt="image-20220614204525181" src="https://pic.tim-wcx.ltd/2022/06/14/62a882e9441fd.png" /></p>
<table>
<thead>
<tr>
<th><strong>P2.7</strong></th>
<th><strong>P2.6</strong></th>
<th><strong>P2.5</strong></th>
<th><strong>选通的寄存器</strong></th>
<th><strong>被选通寄存器的地址</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td>8路输入寄存器</td>
<td><strong>3FFFH</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td><strong>0</strong></td>
<td>4路输入寄存器</td>
<td><strong>1FFFH</strong></td>
</tr>
<tr>
<td><strong>0</strong></td>
<td><strong>1</strong></td>
<td><strong>0</strong></td>
<td>12位DA转换器</td>
<td><strong>5FFFH</strong></td>
</tr>
</tbody>
</table>
<h4 id="ad">并行A/D转换器及接口技术<a class="headerlink" href="#ad" title="Permanent link">&para;</a></h4>
<p>A/D转换器（ADC）用于实现将模拟量转换成与输入量成比例的数字量。A/D转换过程主要包括采样、量化与编码三个环节。根据转换原理，可将A/D转换器分为逐次逼近式、双积分式、并行式、计数式等。目前使用较多的是前三种。本节将重点介绍A/D转换的主要技术指标、典型的逐次逼近式A/D转换器ADC0809芯片的基本结构、引脚功能及与MCS-51系列单片机的接口技术和使用方法。 </p>
<p>1、分辨率</p>
<p>分辨率说明A/D转换器对输入模拟信号的分辨能力。A/D转换器的分辨率以输出二进制的位数表示。从理论上讲，n位二进制数输出的A/D转换器能区分2n个不同等级的模拟电压，能区分输入模拟电压的最小值为满量程输入（VFS）的<span class="arithmatex"><span class="MathJax_Preview">1/2^n</span><script type="math/tex">1/2^n</script></span> ，即VFS/2n。当VFS一定时，输出位数越多，量化单位越小，则分辨率越高。例如，若A/D转换器的VFS为10V，当A/D转换器的输出为8位、10位和12位数字量时，其可分辨的最小电压分别为39.06mV，9.77mV和2.44mV。当电压的变化低于这些值时，A/D转换器不能分辨。</p>
<p>2、转换误差</p>
<p>转换误差表示A/D转换器实际输出的数字量与理论输出数字量之间的差别，即实际转换点偏离理想特性的误差，常用最低有效位的倍数表示。如给出相对误差≤±LSB/2，表明实际输出的数字量和理论上应得到的输出数字量之间的误差小于最低位的一半。</p>
<p>有时也用满量程输出的百分数给出转换误差。例如A/D转换器的输出为十进制的位（即所谓的三位半），转换误差为±0.005％VFS，则满量程输出为1999，最大输出误差小于最低位的1。</p>
<p>3、转换时间</p>
<p>转换时间是指从转换器从接到转换启动信号开始，到输出端得到稳定的数字信号所经过的时间。A/D转换器的转换时间主要取决于转换电路的类型，不同类型A/D转换器的转换时间相差很大。其中，并行A/D转换器转换时间最短，速度最高，仅需几十纳秒；逐次逼近型A/D转换器次之，转换时间一般在几十微秒；双积分式A/D转换器转换速度最慢，转换时间一般在几十至几百毫秒。</p>
<p>实际应用中，应从系统的位数、精度要求、输入模拟信号的范围及输入信号极性等方面综合考虑ADC的选用。</p>
<h4 id="adadc0808adc0809">A/D转换器ADC0808和ADC0809<a class="headerlink" href="#adadc0808adc0809" title="Permanent link">&para;</a></h4>
<p>ADC0808和ADC0809是典型的逐次逼近式A/D转换器，除精度略有差别外（ADC0808的精度是8位，ADC0809的精度是7位），其余各方面完全相同。主要技术指标和特性如下：</p>
<p>1、主要技术指标和特性</p>
<p>• 分辨率：8位；</p>
<p>• 总的不可调误差：ADC0808为±（&frac12;）LSB，ADC0809为±1LSB；</p>
<p>• 模拟量输入通道：8路；</p>
<p>•转换时间：取决于芯片的时钟频率，当CLK＝500kHz是，转换时间为128μs；</p>
<p>•单一电源：+5V；</p>
<p>• 模拟输入电压范围：单极性0～+5V，双极性±5V或±10V；</p>
<p>• 具有可控三态输出锁存器；</p>
<p>• 启动转换控制为脉冲式（正脉冲）。上升沿使内部所有寄存器清“0”，下降沿使A/D转换开始；</p>
<p>• 输出与TTL兼容；</p>
<p>• 使用时不需要进行零点和满刻度调节。 </p>
<p>ADC0809(0808)原理图 </p>
<p><img alt="image-20220614204947219" src="https://pic.tim-wcx.ltd/2022/06/14/62a883efc1d5f.png" /></p>
<p>如图11-15所示，ADC0809由两部分组成。第一部分为8通道多路模拟开关以及相应的通道地址锁存与译码电路，可以实现8路模拟信号的分时采集，其8路模拟输入通道的选择如表11-2所示。三个地址信号ADDA、ADDB和ADDC决定是哪一路模拟信号被选中，并送到内部A/D转换器中进行转换。 </p>
<p>第二部分为一个逐次逼近式A/D转换器，它由比较器、控制逻辑、三态输出缓冲器、逐位逼近寄存器SAR以及树状开关和256R梯型电阻网络组成。其中由树状开关和256R梯型电阻网络构成D/A转换器。 </p>
<p>逐次逼近式的转换原理是“逐位比较”，其过程类似于用砝码在天平上称物体质量。控制逻辑用来控制逐位逼近寄存器从高位至低位逐位取“1”，然后将此数字量经D/A转换后输出一个模拟电压Vs，Vs与输入模拟量Vx在比较器中进行比较，当Vs&gt;Vx时，该位Di＝0，若Vs≤Vx时，该位Di＝1。因此从D7至D0逐位逼近并比较8次，逐位逼近寄存器中的数字量，即为与模拟量Vx所对应的数字量。此数字量送入输出锁存缓冲器，并同时发出转换结束信号EOC（高电平有效，经反相器后，可向CPU发中断请求），表示一次转换结束。此时，CPU发出一个输出允许命令OE（高电平有效）即可读取数据。</p>
<p>2、引脚功能</p>
<p>IN0～IN7：8路模拟量的输入端。</p>
<p>D0～D7：A/D转换后的数据输出端，为三态可控输出，可直接与计算机数据线相连。</p>
<p>注意：对于ADC0809，D0为最低有效位，D7为最高有效位，而ADC0808中正好相反，即D7为最低有效位，D0为最高有效位。</p>
<p>ADDA、ADDB、ADDC：模拟通道地址选择端，ADDC为最高位，ADDA为最低位。</p>
<p>START：转换启动信号。为了启动A/D转换，应在此引脚加一个正脉冲，在脉冲的上升沿时将内部寄存器全部清0，<strong>下降沿时开始A/D转换过程</strong>。</p>
<p>CLK：实时时钟，最高允许值为640kHz，可通过外接电路提供频率信号，也可用单片机ALE引脚信号分频获得。</p>
<p>EOC：转换结束信号。转换开始时，EOC信号变为低电平；当转换结束后，转换后的数据可以读出时，EOC变为高电平。</p>
<p>此信号可用作A/D转换是否完成的查询信号或向CPU请求中断的信号。</p>
<p>OE：输出允许信号或称为A/D数据读信号，高电平有效。OE可与系统读选通信号RD相连。当计算机发出此信号时，ADC的三态门被打开，此时可通过数据线读出转换结果。由于OE与RD的有效电平不同，因此，使用中要注意加非门。</p>
<p>ALE：地址锁存允许，高电平有效。高电平时把由ADDC、ADDB、ADDA组成的地址信号送入地址锁存器，并经译码后得到地址输出，以选择相应的模拟输入通道。</p>
<p>VREF(+)，VREF(-)：正、负参考电压输入端，用于提供片内DAC电阻网络的基准电压，其值决定了输入模拟量的量程范围。在单极性输入时， VREF(+)接+5V，VREF(-)接地，但在双极性输入时， VREF(+)和VREF(-)分别接正、负极性的参考电压。</p>
<p>Vcc，GND：电源电压Vcc接+5V，GND为地。</p>
<p>3、基于地址的编程方法</p>
<p><img alt="image-20220614205304935" src="https://pic.tim-wcx.ltd/2022/06/14/62a884b45a0b5.png" /></p>
<p>​     当MCS-51产生WR写信号时，由WR和P2.0的或非输出作为转换器的START和ALE（高电平有效），同时将通道地址ADDA、ADDB、ADDC送地址总线，模拟量通过被选中的通道送到A/D转换器，并在START下降沿时开始逐位转换，当转换结束时，转换结束信号EOC变高电平。经反相器可向CPU发中断请求，也可采用查询方式检查A/D转换是否结束。</p>
<p>当MCS-51产生RD读信号时，由RD与P2.0的或非输出产生输出允许信号OE（高电平有效），使A/D转换结果读入MCS-51单片机。</p>
<p>① 定时采样方式---140μs左右</p>
<p>② 程序查询方式</p>
<p>③ 中断采样方式</p>
<p>3、基于地址的编程实现</p>
<p>① 定时采样方式---140μs左右</p>
<p>② 程序查询方式</p>
<p>③ 中断采样方式</p>
<h4 id="12adad574">12位并行A/D转换器AD574<a class="headerlink" href="#12adad574" title="Permanent link">&para;</a></h4>
<p>AD574A/AD674A是美国AD公司生产的12位逐次逼近型ADC芯片，转换时间为35μs，转换精度为0.05%，由于芯片内有三态输出缓冲电路，因而可直接与单片机的数据总线相连，而无须附加逻辑接口电路，且能与CMOS及TTL电路兼容。由于AD574A片内包含高精度的参考电压源和时钟电路，使AD574A在不需任何外部电路和时钟信号的情况下完成A/D转换功能，应用非常方便。</p>
<p>AD574的结构框图图11-22 AD574的结构框图</p>
<p>AD574的结构框图如图11-22所示。AD574A芯片内部有模拟和数字两种电路，模拟电路为12位D/A转换器，数字电路则包括比较器、逐次比较寄存器、时钟电路、逻辑控制电路和数据三态输出缓冲器，可进行12位或8位转换。12位的输出可一次完成(与16位的数据总线相连)，也可先输出高8位，后输出低8位，分两次完成。 </p>
<p><img alt="image-20220614205618923" src="https://pic.tim-wcx.ltd/2022/06/14/62a88577b5431.png" /></p>
<p>12/8——数据输出方式选择。高电平时双字节输出，即输出为12位；低电平时单字节输出，分两次输出高8位和低4位。</p>
<p>CS——片选信号。低电平有效。</p>
<p>A0——转换数据长度选择。在启动转换的情况下，A0为高时进行8位转换，A0为低时进行12位转换。</p>
<p>R/C——读数据/转换控制信号。高电平时可将转换后的数据读出，低电平时启动转换。</p>
<p>CE——芯片允许信号。用来控制转换或读操作。</p>
<p>VCC和VEE——模拟部分供电电路的正电源和负电源，其范围为±12V或±15V。</p>
<p>REF OUT——+10V内部参考电压输出，具有1.5mA的带负载能力。</p>
<p>AGND——模拟信号公共地。它是AD574A的内部参考点，必须与系统的模拟参考点相连。</p>
<p>REF IN——参考电压输入，与REF OUT相连可自行提供参考电压。</p>
<p>BIP OFF——补偿调整，接至正负可调的分压网络，以调整ADC输出的零点。</p>
<p>10VIN——模拟信号输入端。输入电压范围是：单极性工作时输入0～10V，双极性工作时输入-5～+5V。</p>
<p>20VIN——模拟信号输入端。输入电压范围是：单极性工作时输入0～20V，双极性工作时输入-10～+10V。</p>
<p>DGND——数字信号公共地。</p>
<p>DB11～DB0——数字量输出。</p>
<p>STS——转换状态输出。转换开始时及整个转换过程中，STS一直保持高电平；转换结束，STS立即返回低电平。可用查询方式检测此电位的变化，来判断转换是否结束，也可利用它的下降沿向CPU发出中断申请，通知CPU A/D转换已经完成，可以读取转换结果。 </p>
<p><img alt="image-20220614205745745" src="https://pic.tim-wcx.ltd/2022/06/14/62a885cbadba5.png" /></p>
<p>1、D574A单极性和双极性电路</p>
<p>​       通过改变AD574A引脚8、10、12的外接电路，可使AD574A进行单极性和双极性模拟信号的转换，其电路如图11-24所示。其系统模拟信号地应与引脚9相连，使其地线接触电阻尽可能的小。</p>
<p><img alt="image-20220614205817374" src="https://pic.tim-wcx.ltd/2022/06/14/62a885ea96f34.png" /></p>
<p>2、AD574A与MCS-51系列单片机的接口电路</p>
<p>AD574A与MCS-51系列单片机实用接口电路如图11-25所示、由于AD574A片内有时钟，故无需外加时钟信号该电路采用双极性输入可对±5V或±10V模拟信号进行转换。当AD574A与MCS-51系列单片机相连时，由于AD574A输出12位数字量，所以当单片机读取转换结果时，需分两次进行：先高8位、后低4位。由A0=0或A0=1来分别控制读取高8位或低4位。</p>
<p>单片机可以采用延时、查询、中断方式读取AD574A的转换结果，本电路采用查询方式，将转换结果状态线与单片机的P1.0线相连。当单片机执行对外部数据存储器的写指令，使CE=1，CS=0，R/C=0，A0=0，便启动转换。然后单片机通过P1.0查询STS 的状态，当STS=0表示转换结束，单片机通过两次读外部数据存储器操作，读取12 位转换结果。这时．当CE=1，CS=0，R/C=0，A0=0，读取高8位；CE=1，CS=0，R/C=1，A0=1，读取低4位。</p>
<p><img alt="image-20220614210118592" src="https://pic.tim-wcx.ltd/2022/06/14/62a886a34e49e.png" /></p>
<h3 id="12">第12章 单片机应用系统设计与调试<a class="headerlink" href="#12" title="Permanent link">&para;</a></h3>
<h4 id="_22">单片机系统开发与工具<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4>
<p>单片机应用系统包括硬件系统和软件系统两大部分。</p>
<p>硬件系统:指单片机及扩展的存储器、外围设备及其接口电路等。</p>
<p>软件系统:包括监控程序和各种应用程序。</p>
<p>1、单片机系统总体方案规划</p>
<p>应该明确控制对象或过程中的技术指标，制定系统中信号或数据的输入、处理、存储和输出的格式和要求。</p>
<p>要明确数据处理中的数学模型，以简化系统的软硬件设计。</p>
<p>应合理划分系统软硬件的功能和任务，做到软硬件结合互补，降低系统成本，提高其稳定性。</p>
<p>2、单片机系统硬件设计 </p>
<p>单片机芯片具有较强的功能，但仅此不能满足实际应用系统的功能要求。硬件系统设计内容包括最小系统设计和系统扩展设计。</p>
<p>3、单片机系统软件设计 </p>
<p>应用系统软件设计是根据系统功能要求，采用汇编语言或其他高级语言进行设计的。系统软件设计是单片机应用系统设计的灵魂所在，设计中应注重编程思想的运用和经典算法的使用。</p>
<p>4、系统调试</p>
<p>系统调试分硬件调试、软件调试和系统联调三个方面，硬件调试和软件调试可结合硬件设计和软件设计进行，并最终通过系统的联合调试来检验整体系统的可靠性、稳定性和实用性。</p>
<p>5、单片机应用系统开发大致分为四个步骤：</p>
<p>（1）需求分析、方案讨论和总体设计</p>
<p>（2）器件选择，电路设计、程序编程</p>
<p>（3）系统调试与稳定性测试</p>
<p>（4）文件整理</p>
<p>6、硬件系统设计原则：</p>
<p>① 在考虑新技术的前提下，根据单片机常规用法，尽可能选择经典通用电路。</p>
<p>② 系统扩展与外围设备配置的水平应充分满足应用系统当前的功能要求。</p>
<p>③ 硬件结构设计应与应用软件方案一并考虑。</p>
<p>④ 整个系统中各器件要尽可能做到性能匹配。</p>
<p>⑤ 可靠性及抗干扰设计是硬件设计中不可忽视的一部分。</p>
<p>⑥ 单片机外接电路较多时，必须考虑其驱动能力。</p>
<p>⑦ 尽可能朝“单片”方向设计硬件系统。</p>
<p>7、应用软件设计原则 ：</p>
<p>① 软件结构清晰、规范、简洁、流程合理、注重算法的巧妙应用。</p>
<p>② 各功能程序要实现模块化、系统化，这样既便于调试、连接，又便于移植、修改和维护。</p>
<p>③ 考虑所选单片机ROM和RAM容量。</p>
<p>④ 运行状态实现标志化管理。</p>
<p>⑤ 实现全面软件抗干扰设计。</p>
<p>⑥ 为了提高运行的可靠性，在应用软件中设置自诊断程序。</p>
<p>按照使用开发工具不同，单片机开发系统包括四种模式：</p>
<p>（1）仿真器型单片机开发系统</p>
<p>（2）通用编程器型单片机开发系统</p>
<p>（3）在系统调试型开发系统</p>
<p>（4）软件仿真型单片机开发系统</p>
<p>8、硬件调试</p>
<p>硬件系统焊接完成后，在系统加电前，开发人员需根据电路原理图等仔细检查硬件系统，观察有无虚焊、漏焊现象，核对元器件型号、规格和安装情况等是否符合设计要求。检查系统总线是否完好，有无短路或串接，及其他信号线路情况。</p>
<p>9、软件调试</p>
<p>调试一般是通过跟踪变量的赋值过程，以及查看内存或堆栈的内容等来进行系统软件逻辑功能的验证和查错。</p>
<p>第一种是使用软件模拟调试。</p>
<p>第二种方法是仿真器调试。</p>
<p>硬件调试和软件调试是紧密联系，相辅相成的。</p>
<h4 id="_23">功率扩展与隔离技术<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4>
<p>1、功率扩展</p>
<p>单片机也可以通过继电器进行功率扩展。</p>
<p>2、隔离技术</p>
<p>1）物理隔离</p>
<p>物理隔离是指对小信号低电平的隔离。要求系统信号连线应尽量远离高电平大功率导线，以减少噪声和电磁场干扰。</p>
<p>在PCB设计时，信号回路的印刷铜箔条要有足够的间距。</p>
<p>信号线尽量减少平行布置。</p>
<p>容易接受干扰的信号线，不能与能够产生干扰或传递干扰的线路长距离范围内平行铺设。</p>
<p>2）光电隔离</p>
<p>光耦合器亦称光电隔离器或光电耦合器，简称光耦（optical coupler，OC）。</p>
<p><img alt="image-20220614210725418" src="https://pic.tim-wcx.ltd/2022/06/14/62a88813dbf9f.png" /></p>
<p>3、单片机应用系统的抗干扰技术</p>
<p>1）干扰的来源</p>
<p>空间电磁干扰 供电系统干扰 过程通道干扰 系统内部干扰</p>
<p>2）硬件抗干扰技术</p>
<p>​   （1）系统供电抗干扰措施</p>
<p>​   （2）接地问题</p>
<p>​       ① 安全接地</p>
<p>​       ② 工作接地</p>
<p>​   （3）屏蔽技术</p>
<p>​   （4）印制板的抗干扰设计</p>
<p>3）软件抗干扰技术</p>
<p>​      软件抗干扰技术是当系统受干扰后，使系统恢复正常运行或输入信号受干扰后去伪存真的一种辅助方法。</p>
<p>​      软件抗干扰技术所研究的内容主要包括:</p>
<p>​      1.是采用软件的方法抑制叠加在模拟输入信号上噪声的影响，如数字滤波器技术；</p>
<p>​      2.是在干扰造成运行程序发生混乱、程序乱飞或陷入死循环时，采用程序的方法将其纳入正规，如软件冗余、软件陷阱、“看门狗”技术等。</p>
<p>3.1 软件滤波</p>
<p>​       随着计算机技术的迅速发展，数字滤波器（DF-digital filter）正获得愈来愈广泛的应用，它通过计算机执行一段相应的程序来滤除夹杂在数字信号中的干扰信号，因此也称为软件滤波器。常用的数字滤波程序很多，有算术平均值法、超值滤波法、中值法、比较取舍法、竞赛评分法、取极值法、滑动算术平均法和一阶低通滤波法等。</p>
<p>3.2 指令冗余技术</p>
<p>实践证明，在CPU受到外界干扰后，PC指针会“乱跳”，如果PC指针刚好跳到操作数的地址上，CPU会误将操作数当指令码来执行，由此造成PC指针的进一步“跑飞”，程序运行会混乱，这时必须采用措施将其纳入正轨。</p>
<p>3.3 软件陷阱技术</p>
<p>所谓软件陷阱其实是一条引导指令，它强行将捕获的程序引向复位入口地址0000H或一个指定的地址，在指定地址那里有一段专门对程序出错进行处理的程序。比如说出错处理程序入口标号为ERROR，则引导指令为LJMP  ERROR。为了安全，其前面还可以加两条NOP指令。</p>
<p>3.4 “看门狗”技术</p>
<p>“看门狗”技术就是不断监视程序循环运行时间，若发现时间超过已知的循环设定时间，则认为系统陷入死循环，然后强迫程序返回到0000H入口，使系统及时恢复正常工作。</p>
<p>硬件“看门狗”和软件“看门狗”</p>





                
              </article>
            </div>
          
          
        </div>
        
          <button type="button" class="md-top md-icon" data-md-component="top" hidden>
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
            回到页面顶部
          </button>
        
      </main>
      
        <footer class="md-footer">
  
    
      
      <nav class="md-footer__inner md-grid" aria-label="页脚" >
        
          
          <a href="../%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 计算机操作系统" rel="prev">
            <div class="md-footer__button md-icon">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
            </div>
            <div class="md-footer__title">
              <span class="md-footer__direction">
                上一页
              </span>
              <div class="md-ellipsis">
                计算机操作系统
              </div>
            </div>
          </a>
        
        
          
          <a href="../PDF%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91/" class="md-footer__link md-footer__link--next" aria-label="下一页: PDF划词翻译" rel="next">
            <div class="md-footer__title">
              <span class="md-footer__direction">
                下一页
              </span>
              <div class="md-ellipsis">
                PDF划词翻译
              </div>
            </div>
            <div class="md-footer__button md-icon">
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4Z"/></svg>
            </div>
          </a>
        
      </nav>
    
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    
    <script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.top", "navigation.footer", "content.code.copy", "content.code.select", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}}</script>
    
    
      <script src="../../assets/javascripts/bundle.b4d07000.min.js"></script>
      
        <script src="../../js/extra.js"></script>
      
        <script src="../../js/baidu-tongji.js"></script>
      
        <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-MML-AM_CHTML"></script>
      
    
  </body>
</html>